J'ai un contrôle utilisateur que je charge dans un MainWindow
à l'exécution. Je ne peux pas obtenir une poignée sur la fenêtre contenant à partir du UserControl
.
J'ai essayé this.Parent
, mais c'est toujours nul. Quelqu'un sait-il comment obtenir un handle vers la fenêtre contenant à partir d'un contrôle utilisateur dans WPF?
Voici comment le contrôle est chargé:
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);
}
J'ajouterai mon expérience. Bien que l'utilisation de l'événement Loaded puisse faire le travail, je pense qu'il peut être plus approprié de remplacer la méthode OnInitialized. Loaded se produit après que la fenêtre est affichée pour la première fois. OnInitialized vous donne la possibilité d'apporter des modifications, par exemple, ajouter des contrôles à la fenêtre avant qu'elle ne soit rendue.
la source
Window.GetWindow
retourne encorenull
enOnInitialized
. Semble fonctionner dans l'Loaded
événement uniquement.Essayez d'utiliser VisualTreeHelper.GetParent ou utilisez la fonction récursive ci-dessous pour rechercher la fenêtre parente.
la source
J'avais besoin d'utiliser la méthode Window.GetWindow (this) dans le gestionnaire d'événements Loaded. En d'autres termes, j'ai utilisé la réponse d'Ian Oakes en combinaison avec la réponse d'Alex pour obtenir le parent d'un contrôle utilisateur.
la source
Cette approche a fonctionné pour moi mais elle n'est pas aussi précise que votre question:
la source
Si vous trouvez cette question et que le VisualTreeHelper ne fonctionne pas pour vous ou ne fonctionne pas de manière sporadique, vous devrez peut-être inclure LogicalTreeHelper dans votre algorithme.
Voici ce que j'utilise:
la source
LogicalTreeHelper.GetParent
dans le code.Que dis-tu de ça:
la source
J'ai trouvé que le parent d'un UserControl est toujours nul dans le constructeur, mais dans tous les gestionnaires d'événements, le parent est défini correctement. Je suppose que cela doit avoir quelque chose à voir avec la façon dont l'arbre de contrôle est chargé. Donc, pour contourner cela, vous pouvez simplement obtenir le parent dans l'événement de contrôle Loaded.
Pour un exemple, consultez cette question DataContext de WPF User Control est Null
la source
Autrement:
la source
Cela fonctionne pour moi:
la source
Cela n'a pas fonctionné pour moi, car il est allé trop loin dans l'arborescence et a obtenu la fenêtre racine absolue pour l'ensemble de l'application:
Cependant, cela a fonctionné pour obtenir la fenêtre immédiate:
la source
la source
la source
Edition plaquée or de ce qui précède (j'ai besoin d'une fonction générique qui peut en déduire un
Window
dans le contexte d'unMarkupExtension
: -MyWrapper.Owner()
inférera correctement une fenêtre sur la base suivante:Window
en parcourant l'arborescence visuelle (si utilisé dans le contexte de aUserControl
)Window
balisage d'un)la source
Différentes approches et différentes stratégies. Dans mon cas, je n'ai pas pu trouver la fenêtre de ma boîte de dialogue en utilisant VisualTreeHelper ou des méthodes d'extension de Telerik pour trouver le parent d'un type donné. Au lieu de cela, j'ai trouvé ma vue de dialogue qui accepte l'injection personnalisée de contenu à l'aide de Application.Current.Windows.
la source
Le
Window.GetWindow(userControl)
renverra la fenêtre réelle uniquement après l'initialisation de la fenêtre (InitializeComponent()
méthode terminée).Cela signifie que si votre contrôle utilisateur est initialisé avec sa fenêtre (par exemple, vous placez votre contrôle utilisateur dans le fichier xaml de la fenêtre), alors sur l'
OnInitialized
événement du contrôle utilisateur, vous n'obtiendrez pas la fenêtre (elle sera nulle), car dans ce cas, le contrôle de l'utilisateurOnInitialized
événement déclenche avant l'initialisation de la fenêtre.Cela signifie également que si votre contrôle utilisateur est initialisé après sa fenêtre, vous pouvez obtenir la fenêtre déjà dans le constructeur du contrôle utilisateur.
la source
Si vous souhaitez simplement obtenir un parent spécifique, non seulement la fenêtre, un parent spécifique dans la structure arborescente, et également ne pas utiliser de récursivité ou de compteurs de boucle d'arrêt dur, vous pouvez utiliser ce qui suit:
Ne placez pas cet appel dans un constructeur (car la
Parent
propriété n'est pas encore initialisée). Ajoutez-le dans le gestionnaire d'événements de chargement ou dans d'autres parties de votre application.la source