
Dacă metoda GetTemplateChild
aparent nu funcționează, încearcă să faci un constructor static pentru clasa elementului asupra căruia se aplică respectivul ControlTemplate
:
De exemplu, dacă clasa se numește AudioFileSelector
, acest cod va face ca GetTemplateChild
să nu mai întoarcă null
mereu.
static AudioFileSelector()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(AudioFileSelector),
new FrameworkPropertyMetadata(typeof(AudioFileSelector)));
}
Apoi, aproape la fel ca atunci când ai un UserControl
cu elemente în conținutul lui cu atributul Name
sau x:Name
setat și le folosești direct specificându-le numele în fișierul cu extensia .xaml.cs, acum trebuie să declari la nivelul clasei, de obicei în același fișier .xaml.cs, câteva câmpuri (field-uri), câte unul pentru fiecare element cu nume din interiorul Template
-ului pe care dorești să le folosești, chiar și doar pentru a gestiona anumite evenimente ale lor:
internal Button MyButton1, MyTextBox1;
și pui o suprascriere (override) la metoda OnApplyTemplate
asftel:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
MyButton1 = (Button)GetTemplateChild("MyButton1");
MyTextBox1 = (TextBox)GetTemplateChild("MyTextBox1");
// eventual se atașează aici câteva handlere la evenimente ale MyButton1, MyTextBox1 etc.
}
apoi în interiorul clasei, oriunde este nevoie de aceste elemente ale ControlTemplate
-ului se apelează:
în cazul în care acest apel întoarce true
, se pot imediat apoi folosi câmpurile MyButton1
, MyTextBox1
etc.
Apelul la ApplyTemplate
apelează indirect OnApplyTemplate
. El este necesar mai ales când este nevoie de un subelement înainte ca evenimentul Loaded
al elementului asupra căruia se aplică ControlTemplate
-ul să fie apelat.