Это мой текущий сценарий: у меня есть несколько пользовательских элементов управления внутри разных TabItems в одном TabControl в окне WPF. Что-то типа:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="S.C.A.R" WindowState="Maximized">
<TabControl Name="MainTabControl">
<TabItem Name="TabOps">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="30"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Local:ServiceList Height="Auto" CanInsert="True" CanCollapse="True" Grid.ColumnSpan="3" x:Name="SL" RecordState="Edit"/>
<Local:ReservationList CanCollapse="True" Grid.Row="1" RecordState="Edit" x:Name="RL"/>
<Local:DriverList CanDelete="False" CanInsert="False" CanCollapse="True" Grid.Row="1" Grid.Column="2" RecordState="Edit" x:Name="DL"/>
<Local:CustomerForm CanDelete="False" CanInsert="False" Grid.Row="2" Grid.ColumnSpan="3" RecordState="View" x:Name="CL"/>
</Grid>
</TabItem>
<TabItemItem Name="TabCodes">
<Local:CustomerList x:Name="CustomerCRUD" RecordState="View"/>
</TabItem>
<Button Grid.Row="1" Content="TEST" Click="Button_Click"/>
</Grid>
</Border>
</Window>
Извините за отступ. По какой-то причине я не могу получить здесь правильный отступ кода :(
Что мне нужно сделать, так это определить (желательно в методе TabControl.Load
, какие из моих различных пользовательских элементов управления видны в данный момент. Мне нужно сделать это динамическим способом, я не могу жестко запрограммировать отношения между элементами TabItems и их дети, что-то вроде: if (TabControl.SelectedItem is XXXX)...
здесь невозможно, потому что это динамический пользовательский интерфейс, и я не могу узнать, какие элементы управления находятся впереди.
Я немного покопался и обнаружил, что элементы управления TabItem
не отображаются в визуальном дереве их «потомков». Я вижу только ContentPresenter
, а потом саму TabControl
. Похоже, что tabItems не «содержат» своего собственного контента, поэтому я не мог, например, сделать FindAncestor
для элементов Tab.
Еще один интересный факт заключается в том, что событие Loaded
моих пользовательских элементов управления вызывается при запуске. Независимо от того, видны они на экране или нет.
Идеальным сценарием будет поиск события, которое запускается только в моих пользовательских элементах управления, когда выбирается TabItem, под которым они находятся.
Цените любые идеи. заранее спасибо