C# 可以知道我的用户控件在哪里吗
假设我有一个UserControl,我在不同的页面中使用它 从我的userControl背后的代码中,是否可以动态地知道它在哪些页面中 MyUserControl.xamlC# 可以知道我的用户控件在哪里吗,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> 假设您有权访问实际的控件对象,则可以垂直遍历可视化树。或者
<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.
}