Ce să faci când FrameworkElement.GetTemplateChild(string) întoarce null?



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ă:

ApplyTemplate();

î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.

Niciun comentariu:

Trimiteți un comentariu