2011-03-16 4 views
2

Ceci est mon scénario actuel: J'ai plusieurs UserControls dans différents TabItems sur un seul TabControl dans une fenêtre WPF. Quelque chose comme:WPF TabControl Enfants

<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> 

Désolé pour l'indentation. Pour une raison quelconque, je ne peux pas obtenir le code correctement indenté ici :(

Ce que je dois faire est de déterminer (de préférence dans la méthode TabControl.Load, qui de mes différentes UserControls sont actuellement visibles. Je dois faire de manière dynamique, je ne peux pas coder en dur la relation entre les TabItems et leurs enfants, quelque chose comme: if (TabControl.SelectedItem is XXXX)... n'est pas possible ici, car il s'agit d'une interface dynamique et je n'ai aucun moyen de savoir quelles commandes sont là avant:

J'ai creusé un peu et découvert que les contrôles TabItem n'apparaissent pas dans l'arborescence visuelle de leurs "enfants". Je ne vois qu'un ContentPresenter, puis le TabControl lui-même. Il semble que les tabItems ne "contiennent" pas leur propre contenu, donc je ne pouvais pas, par exemple, faire un FindAncestor aux éléments de l'onglet.

Un autre fait intéressant est que l'événement Loaded de mes commandes usercontrols est appelé au démarrage. Peu importe si elles sont visibles à l'écran ou non.

Un scénario idéal consistera à trouver un événement qui est déclenché uniquement sur mes commandes Userc quand l'onglet dans lequel elles se trouvent est sélectionné.

Appréciez toutes les idées. Merci à l'avance

+0

Est-ce que vous assimilez avec actuellement visible à un TabItem donné étant sélectionné? Si oui, dynamique ou non, vous pouvez obtenir ce dont vous avez besoin en fonction de l'onglet sélectionné. –

+0

J'ai essayé, mais comme les TabItems n'apparaissent pas dans l'arborescence Visual des contrôles utilisateur, je n'arrive pas à trouver un moyen de savoir si l'élément Tab actuellement sélectionné est celui auquel appartiennent mes UserControls. Par conséquent, je ne peux pas déterminer quels contrôles usuels je dois provisionner (en effectuant des requêtes sur le Business Layer pour amener les données dans l'écran.) –

+0

@HighCore Sont les conteneurs TabItems pour les UserControls où le UserControl est stocké dans la propriété Content du TabItem ? –

Répondre

1

Vous devriez être en mesure de tirer parti de la VisualTreeHelper et consequentrly ce answer sur à fournir les TabItem.Content objet retourné et recherchez le type spécifié, UserControl dans ce cas.

NOTE:

Pour plus de détails s'il vous plaît voir les commentaires qui ont transpiré dans la question du SO.