【发布时间】:2020-12-24 15:11:54
【问题描述】:
我想要什么
我需要在我的选项卡控件中选择一个选项卡并直观地滚动到某个元素。
我的标准 WPF 选项卡控件的 ItemSource 绑定到一组视图模型,这些视图模型没有引用其对应的视图(标准 MVVM 模式)。选项卡控件的 SelectedItem 属性也有一个绑定。
所需选项卡的视图模型和目标控件的名称作为参数给出。
我做了什么
当我打开我的窗口并且选项卡控件是Loaded 时,我通过设置 SelectedItem 属性导航到所需的选项卡。结果,显示了正确的标签页,并且我还在TabControl 上获得了所需的SelectionChanged 事件。
因为我的视图模型中没有对我的视图的引用,所以我需要沿着可视化树向下查找要查找的控件,以便将其显示在视图中。当我将选项卡控件的整个可视化树打印到日志文件中时,可以清楚地看到,我得到了 initial 选项卡页的可视化树,而 not新选的一个。我希望在新标签页加载后获得第二个Loaded 事件,但那没有发生。
问题
我如何知道我新选择的标签页何时加载,以便我可以沿着正确的可视化树走下去?
代码 sn-p
这是我用于遍历可视化图表的函数。我通过提供我的选项卡控件作为输入参数来调用它。我得到了完美的视觉树,但来自初始页面,而不是新选择的页面。
public void FindVisualChildren(DependencyObject obj, string prefix = "")
{
if (obj != null)
{
var output = $"{prefix} obj = {obj}";
if (obj is FrameworkElement frameworkElement && !string.IsNullOrEmpty(frameworkElement.Name))
output += $", name = \"{frameworkElement.Name}\"";
if (obj is TextBlock textBlock && !string.IsNullOrEmpty(textBlock.Text))
output += $", text = \"{textBlock.Text}\"";
if (obj is TextBox textBox && !string.IsNullOrEmpty(textBox.Text))
output += $", text = \"{textBox.Text}\"";
this.WarningWriteLine(() => output);
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
var child = VisualTreeHelper.GetChild(obj, i);
FindVisualChildren(child, prefix + " ");
}
}
}
【问题讨论】:
-
也许您需要将 TabItem(或 TabControl 的 SelectedItem 属性)而不是 TabControl 传递给 FindVisualChildren 函数。
-
你好斯科特。当我在我的函数中使用选项卡控件时,我也会得到所有选项卡项。选项卡页内容的可视化树位于选项卡控件本身,而不是选项卡项上。标签项的可视化树只包含实际的标签(标题等)
标签: c# wpf visual-studio