使用Prism强制创建可视树

时间:2012-08-10 09:56:33

标签: c# wpf prism visualtreehelper visual-tree

我有一个包含Prism区域的TabControl。我想为某些事件触发某种通知(例如闪烁标题页),我想从Prism地区的组件触发此通知。

包含此类组件的标签打开一次后,使用VisualTreeUtil.GetParent()可以很好地运行,直到我找到TabControl并可以对其进行修改以指示通知。

但问题是,在用户打开选项卡之前这不起作用,因为VisualTreeUtil.GetParent()返回null;很明显,因为Prism在那之前没有连接视觉树。

在包含该地区的UpdateLayout()上拨打TabItem无效。我不想以编程方式打开TabItems,因为这会让用户感到困惑。

我有什么办法可以做不到实施某种区域注册表(这会更难看并且难以维护)?

如果你想查看代码,我写了minimal solution来证明这个问题。 打印结构按钮尝试从第二个选项卡上的(最初未显示的不可见) hello TextBlock向上移动可视树。在切换到选项卡之前,它只打印TextBlock,然后到达可视树的根目录。这是我想要完成的,无需切换到标签。

2 个答案:

答案 0 :(得分:1)

添加评论作为答案:

这可能不是您正在寻找的答案,但似乎您采取了非常程序化的方法。

您是否考虑过使用MVVM方法? TabItem中的每个TabControl都可以有HeaderTemplate。在模板中,您可以绑定到ViewModel中的属性,该属性会导致选项卡闪烁或更改外观

答案 1 :(得分:0)

Hm .. IIRC Prism区域只是一个已配置的ContentControl / ContentPresenter。一旦它们准备好工作,所有绑定和数据模型都应该就位,但树不会被创建,因为它们是不可见的。如果是这样,你应该能够对它们调用ApplyTemplate()来强制它。但是,我不记得,如果Prism在init时或者在需要时分配contenttemplates / datacontexts,后者可能会导致调用ApplyTemplate无用。