2009-07-02 9 views
10

Ho un WPF TabControl con un paio di pulsanti nell'intestazione TabItem. Voglio che la scheda selezionata cambi quando si fa clic su un pulsante headered. Qui è un frammento di codice:Come modificare la scheda selezionata in Clic pulsante in WPF TabControl con pulsanti nell'intestazione

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <TabControl> 
     <TabItem Content="Item 1 Content"> 
      <TabItem.Header> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock FontSize="14" FontWeight="Bold" Text="Item1"/> 
        <StackPanel Orientation="Horizontal"> 
        <Button Content="Action 1"/> 
        <Button Content="Action 2"/> 
        </StackPanel> 
       </StackPanel> 
      </TabItem.Header> 
     </TabItem> 
     <TabItem Content="Item 2 Content"> 
      <TabItem.Header> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock FontSize="14" FontWeight="Bold" Text="Item2"/> 
        <StackPanel Orientation="Horizontal"> 
        <Button Content="Action 1"/> 
        <Button Content="Action 2"/> 
        </StackPanel> 
       </StackPanel> 
      </TabItem.Header> 
     </TabItem> 
     </TabControl> 
    </Grid> 
</Page> 

Questo campione mostra un paio di Tab s. Una scheda viene selezionata se si fa clic sullo sfondo dell'intestazione, tuttavia, se si fa clic su un pulsante, la scheda non viene selezionata. Voglio che il pulsante accetti il ​​clic ma voglio anche che la scheda corrispondente al pulsante sia selezionata. Qualcuno può aiutare?

Grazie, Hitesh

risposta

10

Possiamo farlo utilizzando Event Routing. RoutedEvents, ad esempio Click farà scoppiare l'albero degli elementi, finché qualcosa non gestirà l'evento. Per questo motivo, stai già ricevendo l'evento Click sugli elementi della scheda, ma non stiamo ancora facendo nulla. Potremmo creare un evento per gestire il pulsante Clicca sulle voci scheda di questo tipo:

<TabItem Content="Item 1 Content" ButtonBase.Click="TabItem_Click"> 

Tuttavia, avremmo dovuto impostare che in ogni scheda, così invece siamo in grado di creare uno stile per i TabItems nella TabControl in questo modo:

<TabControl> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <EventSetter Event="ButtonBase.Click" 
         Handler="TabItem_Click" /> 
     </Style> 
    </TabControl.ItemContainerStyle> 
.... 
</TabControl> 

Ora, nel nostro gestore di eventi siamo in grado di selezionare la scheda che è stato fatto clic:

private void TabItem_Click(object sender, RoutedEventArgs e) 
{ 
    Trace.WriteLine("TabItemClicked"); 
    ((TabItem)sender).IsSelected = true; 
    e.Handled = true; 
} 
+0

Grazie. Questo ha aiutato. – HiteshP

5

stavo facendo un po 'RnD sul problema di cui sopra ri ght ora ed è stato in grado di realizzare quanto sopra in un modo diverso, ma sarebbe comunque bello se tu potessi aiutarmi nel modo in cui hai eseguito.

Sul caso SelectionChanged del listbox Ho appena cambiato il SelectedItem del controllo scheda a quello che voglio cioè

  Tbctrl.SelectedItem = (TabItem)Tbctrl.FindName("item2"); 

Ecco Tbctrl è il nome del TabControl e item2 è il nome del TabItem in il tabcontrol che contiene le caselle di testo sopra menzionate.

saluti,

Dhaval