C#, WPF – WPF User-control parent (window) is null

C#WPF

Je-li v okně vložen objekt user-control, nelze na události OnInitialized zjistit parent objekt, resp. rodičovské okno user-control objektu, resp. je vždy vrácena hodnota null.

Standardně jsou uvnitř události OnInitialized přístupné hodnoty všech properties nastavených v XAML kódu. Objekt UserControl funguje trochu odlišně, protože závisí na volání InitializeComponent, které vytváří příslušný UI a nastavuje hodnoty jeho členských proměnných. Problém je v tom, že toto volání je uvnitř konstruktoru, což pokračuje na OnInitialized a tím vyvolá inicializovanou událost. K tomu ale dojde dříve, než se použijí vlastnosti sady XAML, v důsledku čehož nejsou vlastnosti sady XAML v této události k dispozici.

To lze vyřešit následujícím způsobem:

Vyhodí-li se volání InitializeComponent z konstruktoru, událost Initialized funguje standardním způsobem. Logicky to má ale za následek, že není vytvořen příslušný UI. Proto přepíšeme metodu OnInitialized a do ní na začátek, ještě před volání base.OnInitialized, vložíme volání InitializeComponent. Níže vzorový příklad takové třídy:

public class MyUserControl : UserControl
{
    public MyUserControl() { }

    protected override void OnInitialized(EventArgs e)
    {
        InitializeComponent();
        base.OnInitialized(e);

        // potenciálně další specifický kód
        // ...
    }
}