Как обрабатывать однократное событие TabItem в WPF?

В моем приложении я использовал WPF TabControl Я хочу обработать событие click из TabItem. Как мне это достичь?

Ответы

Ответ 1

Вы можете сделать это, добавив метки в свойство заголовка для каждого tabitem в tabcontrol. Затем вы можете установить событие для метки.

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>

С#/Code Behind

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

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

Надеюсь, что это поможет.

Ответ 2

Это старый вопрос, но я нахожу ответ, находясь в той же ситуации.

Я использую событие SelectionChanged в TabControl (XAML)

<TabControl SelectionChanged="TabControl_SelectionChanged">

Код за (С#):

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

Это не клик HimSelf, а его работа над освежающим материалом.

Ответ 3

Вы можете использовать событие SelectionChanged в TabControl и использовать случай переключения, чтобы делать что угодно.

//Код 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

Оберните заголовок кнопкой без шаблона.

Если вы используете ItemSource:

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

Ответ 5

Вы можете сделать это, добавив метки в свойство заголовка для каждого tabitem в tabcontrol. Затем вы можете установить событие для метки.

Решение работает очень хорошо; однако "метка" имеет свойства поля, которые могут препятствовать тому, чтобы обработчик "MouseLeftButtonDown" был уволен, если пользователь не нажмет метку. Кроме того, похоже, что стиль для остальных вкладок зависит от добавления ярлыков.

Вы могли бы смягчить это, переопределив свойства по умолчанию/свойства заполнения метки... или даже проще, используя TextBlock.

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

Ответ 6

Обратите внимание, что, хотя ответ, предоставленный d.moncada и другими, касается вопроса, сам вопрос может не соответствовать тому, что предполагалось. Знание того, когда пользователь нажимает на вкладку, отличается от знания, когда пользователь делает вкладку на переднем крае - это можно сделать, нажав на вкладку, но это также может быть достигнуто другими средствами. Например, если вы щелкнете на вкладке, которая уже находится на переднем крае, а затем с помощью стрелок влево/вправо, вы можете переместить другую вкладку на передний план без щелчка мышью - в этом случае событие mouse-left-button-down не вызывается (как и следовало ожидать).

Ответ 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            
    }

надеюсь, что это будет полезно