WPF TabControl SelectedItem更改时如何访问新的可视树

时间:2010-10-29 17:59:18

标签: wpf tabcontrol tabitem visualtreehelper

考虑已加载并呈现的带有三个选项卡的TabControl,其中所选选项卡为索引1(中间选项卡):

标签1:有一个TextBox

标签2:有两个文本框

选项卡3:有三个TextBoxes

如果我使用VisualTreeHelper迭代selectedItem的可视化树,我将在TabControl的子节点中获得两个textBox。

我想在选项卡选择更改时再次迭代并访问新选项卡的控件。如果我切换到选项卡索引2,我应该找到三个使用VisualTreeHelper的文本框。

正常的解决方案是订阅选择更改事件并通过树来获取新显示的控件。问题是,在这个时刻,可视树仍然有旧标签,使这种搜索毫无价值。

如何拦截显示新TabItem的时刻并触发我的搜索?

我正在创建一个动态验证引擎来监视给定UI的所有输入控件,即使它通过ContentControl模板更改或TabControl选择的选项卡更改而发生更改...我希望您能够了解它。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

一种解决方案是延迟访问,直到使用Dispatcher.BeginInvoke完全加载选项卡:

private void TabControlSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded,
                                (Action)(() =>
                                {
                                    // access the new tab's visual tree here
                                }));
}

使用DispatcherPriority.Loaded表示在访问可视树之前需要加载新选项卡。

答案 1 :(得分:0)

TabControl在切换选项卡时加载/卸载其项目,因此您应该能够在TabItem的Loaded事件上附加验证。