我有一个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
答案 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