在Silverlight中获取用户控件之父的更好方法

时间:2011-01-27 16:41:33

标签: silverlight

在我的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)

这是有效的,但它让我想知道是否有更直接的方式来做这个或更优选的方式。有什么想法吗?

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。