2

这是我当前的场景:我在 WPF 窗口中的单个 TabControl 上的不同 TabItems 中有几个 UserControls。就像是:

<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方法中,我的哪些不同的 UserControls 当前是可见的。我需要以动态方式执行此操作,我无法硬编码 TabItems 与其子项之间的关系,例如: if (TabControl.SelectedItem is XXXX)...不是在这里可能,因为这是一个动态 UI,我无法知道前面有哪些控件。

我一直在挖掘一点,发现TabItem控件没有出现在他们的“孩子”的视觉树中。我只看到 a ContentPresenter,然后是TabControl本身。看起来 tabItems 不“包含”它们自己的内容,所以我不能,例如,FindAncestor对 Tab Items 做一个。

另一个有趣的事实是Loaded我的用户控件事件在启动时被调用。无论它们是否在屏幕上可见。

一个理想的方案是找到一个仅在我的用户控件上触发的事件,当它们所在的 TabItem 被选中时。

欣赏任何想法。提前致谢

4

1 回答 1

1

在这种情况下,您应该能够利用SO 上的答案VisualTreeHelper并因此提供返回的对象并查找您指定的类型。TabItem.ContentUserControl

注意

有关更多详细信息,请参阅 SO 问题中的评论。

于 2011-03-16T19:24:03.653 回答