如何更改按钮上的选定选项卡单击WPF TabControl与标题中的按钮

时间:2009-07-02 15:41:45

标签: wpf tabcontrol selecteditem

我有一个WPF TabControl,在TabItem标题中有几个按钮。 我想在单击一个带标题的按钮时更改所选的选项卡。这里 是一段代码片段:

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

此示例显示了几个Tab个。如果单击标题背景,则选择选项卡,但是,如果单击按钮,则不会选择选项卡。我希望按钮接受点击,但我也希望选中与该按钮对应的选项卡。有人可以帮忙吗?

谢谢, 亚太区首席技术官Matt

2 个答案:

答案 0 :(得分:10)

我们可以使用Event Routing来完成此操作。 RoutedEvents,例如Click会冒泡元素树,直到处理事件。因此,您实际上已经在选项卡项上收到了Click事件,我们还没有做任何事情。 我们可以创建一个事件来处理按钮单击选项卡项,如下所示:

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

但是,我们必须在每个选项卡上设置它,所以我们可以在TabControl中为TabItem创建一个样式,如下所示:

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

现在,在我们的事件处理程序中,我们可以选择已单击的选项卡:

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

答案 1 :(得分:5)

我现在对上述问题做了一点RnD,并且能够以不同的方式实现上述目标,但如果你能按照你执行的方式帮助我,那将会很棒。

在列表框的selectionchanged事件中,我只是将选项卡控件的selecteditem更改为我想要的那个。

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

这里Tbctrl是tabcontrol的名称,item2是tabcontrol中包含上述文本框的tabitem的名称。

此致

Dhaval