Ich habe ein Benutzersteuerelement, das ich MainWindow
zur Laufzeit in ein lade . Ich kann das enthaltende Fenster aus dem nicht in den Griff bekommen UserControl
.
Ich habe es versucht this.Parent
, aber es ist immer null. Weiß jemand, wie man von einem Benutzersteuerelement in WPF ein Handle auf das enthaltende Fenster bekommt?
So wird das Steuerelement geladen:
private void XMLLogViewer_MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem application = sender as MenuItem;
string parameter = application.CommandParameter as string;
string controlName = parameter;
if (uxPanel.Children.Count == 0)
{
System.Runtime.Remoting.ObjectHandle instance = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, controlName);
UserControl control = instance.Unwrap() as UserControl;
this.LoadControl(control);
}
}
private void LoadControl(UserControl control)
{
if (uxPanel.Children.Count > 0)
{
foreach (UIElement ctrl in uxPanel.Children)
{
if (ctrl.GetType() != control.GetType())
{
this.SetControl(control);
}
}
}
else
{
this.SetControl(control);
}
}
private void SetControl(UserControl control)
{
control.Width = uxPanel.Width;
control.Height = uxPanel.Height;
uxPanel.Children.Add(control);
}
Ich werde meine Erfahrung hinzufügen. Obwohl die Verwendung des Loaded-Ereignisses den Job erledigen kann, ist es meiner Meinung nach besser geeignet, die OnInitialized-Methode zu überschreiben. Das Laden erfolgt nach der ersten Anzeige des Fensters. Mit OnInitialized können Sie Änderungen vornehmen, z. B. Steuerelemente zum Fenster hinzufügen, bevor es gerendert wird.
quelle
Window.GetWindow
noch zurücknull
inOnInitialized
. ScheintLoaded
nur in der Veranstaltung zu funktionieren .Versuchen Sie es mit VisualTreeHelper.GetParent oder verwenden Sie die folgende rekursive Funktion, um das übergeordnete Fenster zu finden.
quelle
Ich musste die Window.GetWindow (this) -Methode im Loaded-Ereignishandler verwenden. Mit anderen Worten, ich habe die Antwort von Ian Oakes in Kombination mit der Antwort von Alex verwendet, um die Eltern eines Benutzersteuerelements zu erhalten.
quelle
Dieser Ansatz hat bei mir funktioniert, ist aber nicht so spezifisch wie Ihre Frage:
quelle
Wenn Sie diese Frage finden und der VisualTreeHelper nicht oder nur sporadisch für Sie funktioniert, müssen Sie möglicherweise LogicalTreeHelper in Ihren Algorithmus aufnehmen.
Folgendes verwende ich:
quelle
LogicalTreeHelper.GetParent
im Code.Wie wäre es damit:
quelle
Ich habe festgestellt, dass das übergeordnete Element eines UserControl im Konstruktor immer null ist, aber in jedem Fallhandler ist das übergeordnete Element korrekt festgelegt. Ich denke, es muss etwas mit der Art und Weise zu tun haben, wie der Kontrollbaum geladen wird. Um dies zu umgehen, können Sie das übergeordnete Element im Steuerelement Loaded-Ereignis abrufen.
Als Beispiel für das Auschecken dieser Frage lautet der DataContext von WPF User Control Null
quelle
Ein anderer Weg:
quelle
Es funktioniert für mich:
quelle
Dies funktionierte bei mir nicht, da es zu weit oben im Baum lag und das absolute Stammfenster für die gesamte Anwendung erhielt:
Dies funktionierte jedoch, um das unmittelbare Fenster zu erhalten:
quelle
quelle
quelle
Vergoldete Ausgabe des oben genannten (Ich brauche eine generische Funktion, die a
Window
im Kontext von a ableiten kannMarkupExtension
: -MyWrapper.Owner()
wird ein Fenster auf der folgenden Basis korrekt ableiten:Window
durch Gehen über den visuellen Baum (falls im Kontext von a verwendetUserControl
)Window
Markups von a verwendet wird)quelle
Unterschiedliche Ansätze und unterschiedliche Strategien. In meinem Fall konnte ich das Fenster meines Dialogfelds weder mithilfe von VisualTreeHelper noch mithilfe von Erweiterungsmethoden von Telerik finden, um übergeordnete Elemente eines bestimmten Typs zu finden. Stattdessen habe ich meine Dialogansicht gefunden, die das benutzerdefinierte Einfügen von Inhalten mit Application.Current.Windows akzeptiert.
quelle
Das
Window.GetWindow(userControl)
eigentliche Fenster wird erst zurückgegeben, nachdem das Fenster initialisiert wurde (InitializeComponent()
Methode beendet).Dies bedeutet, dass, wenn Ihr Benutzersteuerelement zusammen mit seinem Fenster initialisiert wird (z. B. wenn Sie Ihr Benutzersteuerelement in die xaml-Datei des Fensters einfügen), das
OnInitialized
Ereignis beim Ereignis des Benutzersteuerelements nicht angezeigt wird (es ist null) In diesem Fall wird dasOnInitialized
Ereignis des Benutzersteuerelements ausgelöst, bevor das Fenster initialisiert wird.Dies bedeutet auch, dass Sie das Fenster bereits im Konstruktor des Benutzersteuerelements abrufen können, wenn Ihr Benutzersteuerelement nach seinem Fenster initialisiert wird.
quelle