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);
}