Можно перебирать элементы управления только из первого TabItem элемента TabControl - PullRequest
0 голосов
/ 24 августа 2018

Я новичок в wpf.Я собираюсь получить номера кнопок из двух вкладок.Должно быть 5. Тем не менее, я могу получить только две кнопки из первой вкладки.

Я попытался переключиться на вкладку2, тогда никакие кнопки не могут быть найдены.

Знаете ли вы, как я могу получить все элементы управления со всех вкладок? Я собираюсь связать события со всеми холстами и кнопками на каждой вкладке.

Вот мое главное окно:

<TabControl Name="tabMain" ItemsSource="{Binding Tabs}">
        <TabControl.ItemTemplate>
            <!-- this is the header template-->
            <DataTemplate>
                <TextBlock
                Text="{Binding Header}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate DataType="{x:Type local:MyTabItem}">
                <ItemsControl ItemsSource="{Binding Content}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate DataType="{x:Type local:MyTabItemCtrl}" >
                            <Button Content="{Binding Name}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                    <ItemsControl.ItemContainerStyle>
                        <Style TargetType="ContentPresenter">
                            <Setter Property="Canvas.Left" Value="{Binding Path=PosX}" />
                            <Setter Property="Canvas.Top" Value="{Binding Path=PosY}" />
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

MainWindow.xaml.cs:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var btns = UIHelper.FindVisualChildren<Button>(tabMain).ToList();
    // btns == 2
}

ViewModels:

public sealed class MyViewModel
{
    public ObservableCollection<MyTabItem> Tabs { get; set; }
    public MyViewModel()
    {
        Tabs = new ObservableCollection<MyTabItem>();

        ObservableCollection<MyTabItemCtrl> ct1 = new ObservableCollection<MyTabItemCtrl>();
        ct1.Add(new MyTabItemCtrl { Name = "aaa", Age = 5, PosX=10, PosY=10 });
        ct1.Add(new MyTabItemCtrl { Name = "bbb", Age = 5, PosX = 50, PosY = 10 });

        ObservableCollection<MyTabItemCtrl> ct2 = new ObservableCollection<MyTabItemCtrl>();
        ct2.Add(new MyTabItemCtrl { Name = "aaa", Age = 6, PosX = 10, PosY = 10 });
        ct2.Add(new MyTabItemCtrl { Name = "bbb", Age = 6, PosX = 55, PosY = 10 });
        ct2.Add(new MyTabItemCtrl { Name = "ccc", Age = 6, PosX = 100, PosY = 10 });

        Tabs.Add(new MyTabItem { Header = "One", Content = ct1 });
        Tabs.Add(new MyTabItem { Header = "Two", Content = ct2 });
    }
}
public sealed class MyTabItem
{
    public string Header { get; set; }
    public ObservableCollection<MyTabItemCtrl> Content { get; set; }
}

public sealed class MyTabItemCtrl
{
    public string Name { get; set; }
    public int Age { get; set; }
    public double PosX { get; set; }
    public double PosY { get; set; }
}

1 Ответ

0 голосов
/ 24 августа 2018

В визуальное дерево загружается только видимый TabItem, поэтому вы не сможете использовать метод UIHelper.FindVisualChildren для поиска элементов, которые в данный момент не видны.

Когда вы переключаетесь с вкладки, ее содержимое выгружается из визуального дерева. Таким образом, эти Buttons на самом деле не существуют, когда выбрана другая вкладка.

A ContentTemplate - это просто шаблон . Это должно быть реализовано до того, как любые действительные элементы Button будут созданы и добавлены в визуальное дерево.

...