Как получить UserControl внутри TabItem? - PullRequest
0 голосов
/ 12 января 2019

XAML код:

<TabControl TabStripPlacement="Left" Margin="-3,-3,-3,-3" Background="Transparent" SelectionChanged="TabControl_SelectionChanged">
        <TabItem Header="Corn">
            <Grid x:Name="sdfsfd"/>
        </TabItem>
        <TabItem Header="TabItem" >
            <local:CornTab x:Name="cornTab"/>
        </TabItem>
    </TabControl>

Код CS:

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) {
        TabItem ti = ((TabControl)sender).SelectedItem as TabItem;
        Console.WriteLine(ti.Header);

        getChildrenOf(ti, 1);
    }

    private void getChildrenOf(DependencyObject dep, int indents) {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++) {
            var child = VisualTreeHelper.GetChild(dep, i);
            Console.WriteLine($"{new String('\t', indents)}{i}: {child.GetType()}");

            getChildrenOf(child, indents + 1);
        }
    }

Я пытаюсь получить <local:CornTab x:Name="cornTab"/>, когда нажимаю TabItem, но независимо от того, что я делаю, в VisualTreeHelper, похоже, ничего не получится, и распечатки будут одинаковыми, с той лишь разницей, что TabItem.Header.

TabItem
0: System.Windows.Controls.Border
    0: System.Windows.Controls.Grid
        0: MahApps.Metro.Controls.ContentControlEx
            0: System.Windows.Controls.Grid
                0: System.Windows.Controls.ContentPresenter
                    0: System.Windows.Controls.TextBlock
        1: MahApps.Metro.Controls.Underline
            0: System.Windows.Controls.Border
                0: MahApps.Metro.Controls.ClipBorder
                    0: System.Windows.Controls.ContentPresenter
Corn
    0: System.Windows.Controls.Border
        0: System.Windows.Controls.Grid
            0: MahApps.Metro.Controls.ContentControlEx
                0: System.Windows.Controls.Grid
                    0: System.Windows.Controls.ContentPresenter
                        0: System.Windows.Controls.TextBlock
            1: MahApps.Metro.Controls.Underline
                0: System.Windows.Controls.Border
                    0: MahApps.Metro.Controls.ClipBorder
                        0: System.Windows.Controls.ContentPresenter

Возможно, мне нужно пройти по дереву управления иначе?

1 Ответ

0 голосов
/ 12 января 2019

Вам не нужно проходить визуальное дерево.

TabItem - это ContentControl, а ContentControl устанавливает ContentPropertyAttribute как «Содержимое»

System.Windows.Markup.ContentPropertyAttribute:

Указывает, какое свойство типа является свойством содержимого XAML. Процессор XAML использует эту информацию при обработке дочерних элементов XAML представлений XAML приписанного типа.

Поэтому вы можете просто изменить свой метод на этот

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{
    TabItem ti = ((TabControl)sender).SelectedItem as TabItem;
    var content = ti.Content;
    if(content is CornTab cornTab)
    {
        //Do with 'cornTab' whatever you want
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...