13 votes

wPF VisualTreeHelper.GetParent renvoie une classe erronée ?

J'ai défini le XAML suivant.

<Popup x:Class="EMS.Controls.Dictionary.MapTip"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    PopupAnimation="Slide"
     AllowsTransparency="True" Placement="Mouse"       
       x:Name="root"                   
      >

    <Popup.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Resources/Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Popup.Resources>
    <Viewbox x:Name="viewBox" IsHitTestVisible="True">
        <Grid Background="Transparent" Name="mainGrid">

        </Grid>
    </Viewbox>
</Popup>

Si je remonte l'arbre visuel en utilisant VisualTreeHelper.GetParent à partir de "mainGrid", je finis par obtenir System.Windows.Controls.Primitives.PopupRoot, mais jamais la fenêtre contextuelle elle-même. Quelqu'un a-t-il une théorie sur la raison de ce phénomène et sur ce que je peux faire pour y remédier ? J'ai besoin de Popup et non de PopupRoot.

TIA.

1voto

polfosol ఠ_ఠ Points 801

Sur la base de cette réponse et les réponses présentées ici (et grâce à un commentaire de Wouter), j'ai finalement abouti à ceci :

using System.Windows.Media;
using System.Windows.Media.Media3D;

public static class FamilyHelper
{
    public static T FindAncestor<T>(this DependencyObject dObj) where T : DependencyObject
    {
        var uiElement = dObj;
        while (uiElement != null)
        {
            uiElement = VisualTreeHelper.GetParent(uiElement as Visual ?? new UIElement())
                ?? VisualTreeHelper.GetParent(uiElement as Visual3D ?? new UIElement())
                ?? LogicalTreeHelper.GetParent(uiElement);

            if (uiElement is T) return (T) uiElement;
        }
        return null;
    }
}

qui ne se trompe jamais et qui fonctionne pour tous les types de contrôles, par ex.

var element = sender as UIElement;
var parentWindow = element.FindAncestor<Window>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X