Zwykle elementy sterujące WPF są deklarowane w plikach .xaml, a nie w kodzie źródłowym (pliki .xaml.cs). Czasami jednak potrzebuję użyć niektórych z tych kontroli w kodzie, aby manipulować nimi. Jak mogę uzyskać uchwyt takiej kontroli, jeśli "znajduje się" w pliku xaml?Jak uzyskać dostęp do formantu WPF znajdującego się w ControlTemplate?
Odpowiedz
Można użyć metody FindName() klasy ControlTemplate.
// Finding the grid that is generated by the ControlTemplate of the Button
Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1);
Nie jestem pewien, o co prosisz, więc postaram się odpowiedzieć na oba wystąpienia, które interpretuję jako Twoje pytanie.
1) Jeśli chcesz zadeklarować wyraźnego sterowania, a następnie edytować je bezpośrednio, wszystko co musisz zrobić, to ustawić właściwość name jak takie:
<Canvas x:Name="myCanvas"/>
Następnie można uzyskać dostęp do obszaru roboczego poprzez Imię jako takie:
myCanvas.Background = Brushes.Blue;
2) Jeśli szukasz zadeklarować kontrolę rodzajowe, a następnie używać go wiele razy, można zrobić to tak:
<Window>
<Window.Resources>
<Ellipse x:Key="myEllipse" Height="10" Width="10">
</Window.Resources>
</Window>
Następnie można uzyskać dostęp do predefiniowanych kontrolę przy użyciu tej składni w kodzie:
Ellipse tempEllipse = (Ellipse)FindResource("MyEllipse");
Jeśli chcesz użyć resourse jako szablon do wielokrotnych kontroli, dodać X: Shared = „false”.
FindName() zwracał wartość null. FindResource() działało dla mojej aplikacji. Dzięki. – JohnForDummies
To było zwracanie wyjątku zerowego dla mnie, wtedy uświadomiłem sobie coś podczas wypróbowywania różnych odpowiedzi tutaj na SO: użyj odpowiedzi CSharper, jeśli szablon, którego szukasz - jest zastosowany na myButton1_. Ale jeśli myButton1 jest tylko członkiem tego szablonu, użyj '(Grid) myButton1.FindName (" grid ");' zamiast tego (przydatne w procedurach obsługi przycisków). – Naucle