我怎样才能获得System.Windows.Controls.Primitive.PopupRoot类型?

Joe*_*tti 7 reflection wpf

图片可以说出千言万语.

当我爬上可视树时,我看到最后一个父类型为System.Windows.Controls.Pimitives.PopupRoot 在此输入图像描述

但乳清我尝试实际比较那种类型VS抱怨它无效.

在此输入图像描述

Jul*_*ain 7

PopupRootinternalPresentationFramework,所以你不能从你的程序集访问它.您可以比较类型名称GetType().FullName,但是PopupRoot可以在将来的框架版本中更改的实现细节,因此我不会依赖它.


zme*_*nic 5

PopupRoot是内部的,所以你将无法引用它.但是,如果您使用LogicalTreeHelper,您将能够找到Popup是否存在.LogicalTreeHelper如果没有逻辑父代,则返回NULL,因此除了使用步行可视树之外,还需要使用它VisualTreeHelper.

以下是如何使用它的示例:

var popupRootFinder = VisualTreeHelper.GetParent((DependencyObject)your_visual_element);
while (popupRootFinder != null)
{
    var logicalRoot = LogicalTreeHelper.GetParent(popupRootFinder);
    if (logicalRoot is Popup)
    {
        // popup root found here
        break;
    }

    popupRootFinder = VisualTreeHelper.GetParent(popupRootFinder);
}
Run Code Online (Sandbox Code Playgroud)