如何在WPF中处理TabItem的单击事件?

22
在我的应用程序中,我使用了 WPF TabControl,我想要处理 TabItem 的单击事件。我该如何实现?
7个回答

23

您可以通过为选项卡控件中的每个tabitem的标题属性添加标签来实现此操作。然后,您可以为该标签设置一个事件。

xaml

<TabControl Height="100" HorizontalAlignment="Left" Name="tabControl1">
    <TabItem  Name="tabItem1">
        <TabItem.Header>
            <Label Content="tabItem1" 
                MouseLeftButtonDown="tabItem1_Clicked" 
                HorizontalAlignment="Stretch"/>
        </TabItem.Header>
        <Grid />
    </TabItem>
    <TabItem  Name="tabItem2">
        <TabItem.Header>
            <Label Content="tabItem2" 
                MouseLeftButtonDown="tabItem2_Clicked" 
                HorizontalAlignment="Stretch"/>
        </TabItem.Header>
        <Grid />
    </TabItem>
</TabControl>

C# / 代码后台

private void tabItem1_Clicked(object sender, MouseButtonEventArgs e)
{
    //DO SOMETHING
}

private void tabItem2_Clicked(object sender, MouseButtonEventArgs e)
{
    //DO SOMETHING
}

希望这可以帮助到你。


如果我们设置了标签的“内容”属性,是否还需要设置标签的“名称”? - Konrad Viltersten
不需要TabItem的名称。只要Label有关联的点击事件处理程序,它就可以工作。 - d.moncada
很棒的解决方案。谢谢。 - ozzyzig

14

这是一个旧问题,但我在同样的情况下找到了答案。

我在TabControl(XAML)上使用了SelectionChanged事件。

<TabControl SelectionChanged="TabControl_SelectionChanged">

代码后端(C#):

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //Stuff
}

这不是点击自身,但它可以用于刷新内容。


7
这种解决方案给我带来了问题,因为它似乎会在选项卡控件内的控件更改选择时触发,而不仅仅是选项卡控件本身的选择。 - Charles Clayton

13
你可以在TabControl中使用SelectionChanged事件,并使用switch case做任何你喜欢的事情。
// XAML 代码
    <TabControl SelectionChanged="TabControl_SelectionChanged">
        <TabItem Header="Item1"></TabItem>
        <TabItem Header="Item2"></TabItem>
        <TabItem Header="Item3"></TabItem>
    </TabControl>

// 代码背后

    private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string tabItem = ((sender as TabControl).SelectedItem as TabItem).Header as string;

        switch(tabItem)
        {
            case "Item1":
                break;

            case "Item2":
                break;

            case "Item3":
                break;

            default:
                return;
        }
    }

2
请注意,尽管d.moncada和其他人提供的答案回答了问题,但问题本身可能不是所想要的。知道用户何时单击选项卡与知道用户何时使选项卡前置不同 - 可以通过单击选项卡来完成,但也可以通过其他方式实现。例如,如果您单击已经前置的选项卡,然后使用左/右箭头,您可以将另一个选项卡带到前面而无需鼠标单击 - 在这种情况下,鼠标左键按下事件不会被调用(正如您所期望的那样)。"最初的回答"

1
你可以通过为选项卡控件中的每个选项卡项的标题属性添加标签来实现此操作。然后,您可以为该标签设置一个事件。
这种解决方案效果很好;但是,“标签”具有边距属性,这可能会防止“MouseLeftButtonDown”处理程序被触发,除非用户直接点击标签。此外,由于标签填充,似乎其他选项卡的样式也受到影响。
您可以通过覆盖标签的默认边距/填充属性来缓解此问题...甚至更简单地使用TextBlock。
<TabItem x:Name="tabItem1" >
   <TabItem.Header>
      <TextBlock MouseLeftButtonDown="tabItem1_Click">
         Click Me
      </TextBlock>
   </TabItem.Header>
   ...
</TabItem>

1
将标题包装在无模板按钮中。
如果您使用ItemsSource:
<TabControl ItemsSource="{Binding Data}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <Button Click="Tab_Click">
                <Button.Template>
                    <ControlTemplate>
                        <ContentPresenter />
                    </ControlTemplate>
                </Button.Template>
                <Button.Content>
                    <!-- Actual header goes here -->
                </Button.Content>
            </Button>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

如果您有静态内容,可以立即将其插入到标题中:
<TabControl>
    <TabItem>
        <TabItem.Header>
            <Button Click="Tab_Click">
                <Button.Template>
                    <ControlTemplate>
                        <ContentPresenter />
                    </ControlTemplate>
                </Button.Template>
                <Button.Content>
                    <!-- Actual header goes here -->
                </Button.Content>
            </Button>
        </TabItem.Header>
    </TabItem>
</TabControl>

-2
尝试使用GotFocus事件来寻找解决方案。
private void addTabPage_GotFocus(object sender, RoutedEventArgs e)
    {
        addTabPage(); //method for adding page
        TabControlPages.SelectedIndex = TabControlPages.Items.Count - 1; //select added page
        TabControlPages.Focus(); //change forcus to selected page
    }

还有一种添加页面的方法(仅为示例)

    private void addTabPage()
    {
        TabItem tc = new TabItem();
        tc.Header = "New page";
        TabControlPages.Items.Insert(TabControlPages.Items.Count - 1, tc); //insert new page            
    }

希望这会有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接