在我的MainPage.xaml上,我有时需要将UserControl添加到主面板(Canvas)。单击时,UserControl需要从MainPage.xaml访问例程 - 它是父级的父级 - 它将使UserControl本身Visibility = Collapsed
或从MainPage.xaml中一起删除。
现在正在我正在做的UserControl的代码中
Dim c = VisualTreeHelper.GetParent(Me)
Dim mp As MainPage = VisualTreeHelper.GetParent(c)
mp.MyRoutine(3)
这是有效的,但它让我想知道是否有更直接的方式来做这个或更优选的方式。有什么想法吗?
答案 0 :(得分:5)
可以通过Linq To VisualTree获得更通用的可视树导航方法,通过这个小框架,您可以在可视化树上执行各种查询。获得父母的例子很简单:
var parent = me.Ancestors().First();
或者,如果你想找到给定类型的第一个父...
var parent = me.Ancestors<MainPage>().Cast<MainPage>().First()
答案 1 :(得分:4)
一般来说,我会避免这种依赖。它大大降低了UserControl的实用性和灵活性。
相反,在构造(甚至运行时)期间将依赖项推送到UserControl可能更好。您可以传入引用MyRoutine
的委托,或主页实现的接口。
这样,UserControl的依赖性是显而易见的(因为它是API的一部分),以后可以将它与其他应用程序/页面一起使用。
话虽如此,如果你决定保留上述内容,我会至少做一次改变。我不会只是期望父母的父母总是“MainWindow”,而是递归检查父母,直到你在班级的方法中到达MainWindow(或什么都没有)。这至少可以让您灵活地在层次结构中移动UserControl而不会破坏它。
答案 2 :(得分:2)
我浏览可视化树的一般方法是使用我自己的VisualTreeEnumeration代码。然而,正如我在博客中所述,还有其他各种工具可以做同样的事情。无论你使用什么,你最终都会拥有一系列可以追溯的祖先。然而,最灵活的方法是寻找MainPage
类型: -
(注C#)
MainPage mp = this.Ancestors().OfType<MainPage>().FirstOrDefault();
不确定这会是什么样的VB。