3

考虑一个已经加载并呈现的具有三个选项卡的 TabControl,其中选定的选项卡是索引 1(中间一个):

选项卡 1:有一个文本框

选项卡 2:有两个文本框

选项卡 3:具有三个文本框

如果我使用 VisualTreeHelper 遍历 selectedItem 的可视化树,我将在 TabControl 的子项中获得两个文本框。

I want to iterate again when the tab selection changes and access the new tab's controls. 如果我切换到标签索引 2,我应该使用 VisualTreeHelper 找到三个文本框。

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

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

我正在创建一个动态验证引擎,它监视给定 UI 的所有输入控件,即使它因 ContentControl 模板更改或 TabControl 选定选项卡更改而发生更改......我希望你能得到图片。

有任何想法吗?

4

2 回答 2

2

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

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

UsingDispatcherPriority.Loaded意味着在访问可视化树之前需要加载新选项卡。

于 2013-09-27T18:38:44.567 回答
0

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

于 2010-10-29T18:56:40.313 回答