Domanda

Nel profondo del mio oggetto WPF hiearchy creo un oggetto Window.

Tuttavia, voglio che il proprietario di questo oggetto Window sia l'oggetto Window di base .

Ho provato " arrampicandomi sull'albero " con il seguente tipo di codice ma questo approccio sembra non ottimale :

(((((((TabGroupPane)((ContentPane) this.Parent).Parent).Parent as
SplitPane).Parent as DocumentContentHost).Parent as 
XamDockManager).Parent as ContentControl).Parent as 
StackPanel).Parent...

Come posso accedere all'oggetto Window di base?

Sto pensando a qualcosa del genere:

pseudo-codice:

Window baseWindow = this.BaseParent as Window;
È stato utile?

Soluzione

Un approccio che funziona per tutti i tipi è camminare sull'albero logico fino a trovare un nodo del tipo richiesto:

Window baseWindow = FindLogicalParent<Window>(this);

Questo metodo non esiste nel framework, quindi ecco un'implementazione:

internal static T FindLogicalParent<T>(DependencyObject obj)
   where T : DependencyObject
{
    DependencyObject parent = obj;
    while (parent != null)
    {
        T correctlyTyped = parent as T;
        if (correctlyTyped != null)
            return correctlyTyped;
        parent = LogicalTreeHelper.GetParent(parent);
    }

    return null;
}

Per Window in particolare, puoi usare:

Window.GetWindow(this);

Altri suggerimenti

Mi permetta di rispondere a questo:

Window baseWindow = Application.Current.Windows[0];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top