2009-07-02 4 views
10

Ich habe eine WPF TabControl, die ein paar Schaltflächen in der TabItem Header hat. Ich möchte, dass die ausgewählte Registerkarte geändert wird, wenn auf eine Schaltfläche zum Anpassen geklickt wird. Hier ist ein Code-Schnipsel:So ändern Sie ausgewählte Registerkarte auf Schaltfläche klicken in WPF TabControl mit Schaltflächen in Header

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

Diese Probe zeigt ein paar Tab s. Eine Registerkarte wird ausgewählt, wenn auf den Hintergrund der Überschrift geklickt wird. Wenn jedoch auf eine Schaltfläche geklickt wird, ist die Registerkarte nicht ausgewählt. Ich möchte, dass die Schaltfläche den Klick akzeptiert, aber ich möchte auch, dass die Registerkarte für die Schaltfläche ausgewählt wird. Kann jemand helfen?

Danke, Hitesh

Antwort

10

Wir können dies tun, indem Event Routing verwenden. RoutedEvents, z. B. Klick, blubbert den Elementbaum, bis etwas das Ereignis behandelt. Aus diesem Grund erhalten Sie das Click-Ereignis tatsächlich bereits auf den Tab-Elementen, wir machen damit noch nichts. Wir könnten ein Ereignis behandeln die Schaltfläche Klicken Sie auf die Registerkarte Produkte wie diese erstellen:

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

Allerdings würden wir, dass auf jeder Registerkarte, so stattdessen können wir einen Stil für die TabItems in der Gruppe erstellen müssen TabControl wie so:

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

nun in unserem Event-Handler können wir die Registerkarte auswählen, die angeklickt wurde:

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

Danke. Das hat geholfen. – HiteshP

5

ich wurde auf das oben beschriebene Problem ri ein wenig RnD tun ght jetzt und war in der Lage, das oben genannte auf eine andere Weise zu erreichen, aber dennoch wäre es großartig, wenn du mir in der Art und Weise helfen könntest, wie du es ausgeführt hast. Hier Tbctrl ist der Name des tabcontrol und item2 ist der Name des TabItem

Auf der selection Ereignis der Listbox Ich habe gerade die SelectedItem der Registerkarte auf der einen i dh

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

wollen in die tabcontrol, die die oben genannten textboxen enthält.

Grüße,

Dhaval