C# 检索承载嵌套WPF控件的选项卡项

C# 检索承载嵌套WPF控件的选项卡项,c#,wpf,C#,Wpf,我在wpf选项卡控件上有一些嵌套控件。 我只需要找到特定的TabItem,它是控件的父项。最好使用LINQ。任何想法。未选择的选项卡项不存在于可视树中,而是存在于逻辑树中 我举了一个小例子: <TabControl x:Name="TabControl"> <TabItem Header="Test 1"> <Button Content="Click to get TabItem Name" Margin="100" Click=

我在wpf选项卡控件上有一些嵌套控件。
我只需要找到特定的TabItem,它是控件的父项。最好使用LINQ。任何想法。

未选择的选项卡项不存在于可视树中,而是存在于逻辑树中

我举了一个小例子:

<TabControl x:Name="TabControl">
     <TabItem Header="Test 1">
            <Button Content="Click to get TabItem Name" Margin="100" Click="btnGetParent_Click"/>
     </TabItem>
     <TabItem Header="Test 2"/>
</TabControl>

单击TabItem内的按钮将显示TabItem的标题,这意味着您可以访问它,并且可以执行任何需要的工作

我在这里的代码也很简单:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnGetParent_Click(object sender, RoutedEventArgs e)
    {
        TabItem ti = TryFindParent<TabItem>(sender as Button);
        MessageBox.Show(ti.Header.ToString());
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效btnGetParent\u单击(对象发送者,路由目标e)
{
TabItem ti=TryFindParent(发送者为按钮);
Show(ti.Header.ToString());
}
}
这是助手方法:

    public T TryFindParent<T>(DependencyObject child)
    where T : DependencyObject
    {
        DependencyObject parentObject = LogicalTreeHelper.GetParent(child);
        if (parentObject == null) return null;

        T parent = parentObject as T;
        if (parent != null)
            return parent;
        else
            return TryFindParent<T>(parentObject);
    }
public T TryFindParent(DependencyObject子对象)
其中T:DependencyObject
{
DependencyObject parentObject=LogicalTreeHelper.GetParent(子级);
if(parentObject==null)返回null;
T parent=parentObject作为T;
如果(父项!=null)
返回父母;
其他的
返回TryFindParent(parentObject);
}
这里的工作是调用LogicalTreeHelper而不是通常的VisualTreeHelper

试试看,我希望这能有所帮助