考虑已加载并呈现的带有三个选项卡的TabControl,其中所选选项卡为索引1(中间选项卡):
标签1:有一个TextBox
标签2:有两个文本框
选项卡3:有三个TextBoxes
如果我使用VisualTreeHelper迭代selectedItem的可视化树,我将在TabControl的子节点中获得两个textBox。
我想在选项卡选择更改时再次迭代并访问新选项卡的控件。如果我切换到选项卡索引2,我应该找到三个使用VisualTreeHelper的文本框。
正常的解决方案是订阅选择更改事件并通过树来获取新显示的控件。问题是,在这个时刻,可视树仍然有旧标签,使这种搜索毫无价值。
如何拦截显示新TabItem的时刻并触发我的搜索?
我正在创建一个动态验证引擎来监视给定UI的所有输入控件,即使它通过ContentControl模板更改或TabControl选择的选项卡更改而发生更改...我希望您能够了解它。
有什么想法吗?
答案 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事件上附加验证。