【问题标题】:how to handle TabItem single click event in WPF?如何处理 WPF 中的 TabItem 单击事件?
【发布时间】:2011-04-20 08:07:01
【问题描述】:

在我的应用程序中,我使用了 WPF TabControl 我想处理 TabItem 的点击事件。 如何实现?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您可以通过为 tabcontrol 中的每个 tabitem 的 header 属性添加标签来做到这一点。然后你可以为标签设置一个事件。

    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
    }
    

    希望这会有所帮助。

    【讨论】:

    • 如果我们还要设置标签的Content属性,是否还需要设置标签的Name
    • 不,不需要 TabItem 的名称。只要 Label 有关联的点击事件处理程序,它就会起作用。
    • 很好的解决方案。谢谢
    【解决方案2】:

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

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

    <TabControl SelectionChanged="TabControl_SelectionChanged">
    

    代码隐藏(C#):

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

    这不是点击 HimSelf,而是用来提神。

    【讨论】:

    • 这种类型的解决方案给了我一个问题,因为它似乎会在 tabcontrol 中的控件更改选择时触发,而不仅仅是 tabcontrol 本身的选择。
    【解决方案3】:

    您可以在 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;
            }
        }
    

    【讨论】:

      【解决方案4】:

      请注意,尽管 d.moncada 和其他人提供的答案解决了这个问题,但问题本身可能不是预期的。知道用户何时单击选项卡与知道用户何时将选项卡放在最前面是不同的——这可以通过单击选项卡来完成,但也可以通过其他方式实现。例如,如果您单击已经位于最前面的选项卡,然后使用左/右箭头,您可以在不单击鼠标的情况下将另一个选项卡带到前面 - 在这种情况下不会调用 mouse-left-button-down 事件(如您所料)。

      【讨论】:

        【解决方案5】:

        将标题包装在无模板按钮中。

        如果您使用 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>
        

        【讨论】:

          【解决方案6】:

          您可以通过为每个标题属性添加标签来做到这一点 选项卡控件中的 tabitem。然后你可以为标签设置一个事件。

          解决方案效果很好;但是,“标签”具有边距属性,可以防止“MouseLeftButtonDown”处理程序被触发,除非用户单击该标签。此外,由于标签填充,其余选项卡的样式似乎受到了影响。

          您可以通过覆盖标签的默认边距/填充属性来缓解这种情况......或者更简单,使用 TextBlock。

          <TabItem x:Name="tabItem1" >
             <TabItem.Header>
                <TextBlock MouseLeftButtonDown="tabItem1_Click">
                   Click Me
                </TextBlock>
             </TabItem.Header>
             ...
          </TabItem>
          

          【讨论】:

            【解决方案7】:

            尝试通过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            
                }
            

            希望这会有所帮助

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-05
              • 2011-10-11
              • 1970-01-01
              • 2021-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-16
              相关资源
              最近更新 更多