Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以知道我的用户控件在哪里吗_C#_User Controls_Windows Runtime_Winrt Xaml - Fatal编程技术网

C# 可以知道我的用户控件在哪里吗

C# 可以知道我的用户控件在哪里吗,c#,user-controls,windows-runtime,winrt-xaml,C#,User Controls,Windows Runtime,Winrt Xaml,假设我有一个UserControl,我在不同的页面中使用它 从我的userControl背后的代码中,是否可以动态地知道它在哪些页面中 MyUserControl.xaml <UserContol bla bla bla bla bla bla x:Name=ucbox> other xml stuffs </UserContol> 假设您有权访问实际的控件对象,则可以垂直遍历可视化树。或者

假设我有一个UserControl,我在不同的页面中使用它

从我的userControl背后的代码中,是否可以动态地知道它在哪些页面中

MyUserControl.xaml

    <UserContol bla bla bla
            bla bla bla
            x:Name=ucbox>
        other xml stuffs
    </UserContol>

假设您有权访问实际的控件对象,则可以垂直遍历可视化树。或者,您可以使用中包含的扩展来执行类似于
mycontrol.get祖先()
的操作

编辑*(菲利普·斯卡昆)

如果您不想要/不需要完整的工具包,您可以使用这一部分的
VisualTreeHelperExtensions

public static class VisualTreeHelperExtensions
{
    public static IEnumerable<T> GetAncestorsOfType<T>(this DependencyObject start) where T : DependencyObject
    {
        return start.GetAncestors().OfType<T>();
    }

    public static IEnumerable<DependencyObject> GetAncestors(this DependencyObject start)
    {
        var parent = VisualTreeHelper.GetParent(start);

        while (parent != null)
        {
            yield return parent;
            parent = VisualTreeHelper.GetParent(parent);
        }
    }
}
公共静态类VisualTreeHelperExtensions
{
公共静态IEnumerable GetAnceStorSoftType(此DependencyObject开始),其中T:DependencyObject
{
返回()类型的start.getOrients();
}
公共静态IEnumerable GetOrients(此DependencyObject开始)
{
var parent=visualtreeheloper.GetParent(开始);
while(父级!=null)
{
收益母公司;
父级=VisualTreeHelper.GetParent(父级);
}
}
}

在典型情况下,您的
页面
位于可视化树的根目录下的
框架中,因此您也可以从根目录开始抓取它:

var frame = Window.Current.Content as Frame;

if (frame != null)
{
    var page = frame.Content as Page;

    if (page != null)
    {
        // you have found you page!
    }
    else
    {
        // the frame has not loaded a page yet - this isn't very likely to happen
    }
}
else
{
    // the app is either not initialized yet
    // or you have modified the default template and Frame is not at the root.
}

如何垂直遍历可视树?使用
VisualTreeHelper
我看不到任何可以帮助我的方法。
VisualTreeHelper.GetParent
是向上遍历树的方式,
VisualTreeHelper.GetChild
是向下遍历树的方式。使用
VisualTreeHelper.GetParent(ucbox)
我获得userController xaml的根,如何使用VisualTreeHelper获取页面1(或页面2)的根?
VisualTree
是一种结构。你刚才所做的事情上升了一级。现在你需要做的是不断提高级别,直到你能够控制你正在寻找的(页面)。最简单的方法是使用递归函数(
FindAncestorOfType
)。使用
GetParent
并将其存储在变量中(
parent
)。如果它是您正在查找的对象,则您已完成并可以
返回父对象
,否则
返回FindAncestorOfType(父对象)
(或
parent.FindAncestorOfType(type)
,如果将其作为扩展方法)。要重复我答案中的注释,已添加此方法。您所要做的就是从nuget安装它,使用
语句添加
,然后调用
ucbox.GetFirstAncestorOfType()。通过这种方式,您可以首先获得应用程序的根目录,然后从树中删除。是这样吗?我想要的不是,我想把树从UC提升到使用它的页面。有什么区别?我只是将它作为一个替代选项来展示,它不需要在(可能很高的)视觉树上行走,因此可能会表现得更好。
//how can i do that?
var p = get the root of the Page1 or 2
public static class VisualTreeHelperExtensions
{
    public static IEnumerable<T> GetAncestorsOfType<T>(this DependencyObject start) where T : DependencyObject
    {
        return start.GetAncestors().OfType<T>();
    }

    public static IEnumerable<DependencyObject> GetAncestors(this DependencyObject start)
    {
        var parent = VisualTreeHelper.GetParent(start);

        while (parent != null)
        {
            yield return parent;
            parent = VisualTreeHelper.GetParent(parent);
        }
    }
}
var frame = Window.Current.Content as Frame;

if (frame != null)
{
    var page = frame.Content as Page;

    if (page != null)
    {
        // you have found you page!
    }
    else
    {
        // the frame has not loaded a page yet - this isn't very likely to happen
    }
}
else
{
    // the app is either not initialized yet
    // or you have modified the default template and Frame is not at the root.
}