如果项目是动态 WPF,如何为选项卡设置父项

问题描述 投票:0回答:1
wpf
1个回答
0
投票

FrameworkElement.Parent
仅返回逻辑父级并由框架设置。

当您将项目添加到

ItemsControl.ItemsSource
时,
ItemsControl
会在内部生成项目的容器。如果是
TabControl
,生成的项目容器的类型为
TabItem
。生成的
TabItem
容器(或者一般来说
ItemsControl
生成的项目容器)不是
TabControl
的直接逻辑子代。它们是托管并实际生成项目容器的内部
Panel
的子级。
您必须使用
VisualTreeHelper
来查找
TabControl
,它只是视觉父级
TabControl

另一方面,如果您显式地将项目容器添加到

ItemsControl
(您不使用
ItemsSource
ItemsControl
为您生成容器),那么这些容器将直接添加到
ItemsControl
的逻辑树。因此,它们的
Parent
属性设置为拥有它们的
ItemsControl

您当前正在处理

MainWindow
的鼠标事件(通过提供覆盖)。
如果您直接在
TabControl
上处理事件,您的代码会变得更加简单,因为您不必使用
VisualTreeHelper
来获取父级
TabControl
:

<TabControl ItemsSource="{Binding Path=Items, ElementName=mainWin}"
            PreviewMouseLeftButtonUp="OnTabControlPreviewMouseLeftButtonUp" />
private void OnTabControlPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
  var tabControl = (TabControl)sender;
  int clickedTabItemIndex = tabControl.SelectedIndex;
  var clickedTabItemContainer = (TabItem)tabControl.ItemContainerGenerator.ContainerFromIndex(clickedTabItemIndex);
}
© www.soinside.com 2019 - 2024. All rights reserved.