Как обрабатывать события одного клика TabItem в WPF? - PullRequest
16 голосов
/ 20 апреля 2011

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

Ответы [ 7 ]

19 голосов
/ 21 апреля 2011

Вы можете сделать это, добавив метки в свойство заголовка для каждого 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>

C # / Код позади

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

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

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

13 голосов
/ 05 июня 2011

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

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

<TabControl SelectionChanged="TabControl_SelectionChanged">

Код позади (C #):

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

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

9 голосов
/ 25 октября 2014

Вы можете использовать событие 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;
        }
    }
1 голос
/ 20 апреля 2011

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

Если вы используете 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>
0 голосов
/ 05 июня 2019

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

0 голосов
/ 01 декабря 2017

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

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

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

<TabItem x:Name="tabItem1" >
   <TabItem.Header>
      <TextBlock MouseLeftButtonDown="tabItem1_Click">
         Click Me
      </TextBlock>
   </TabItem.Header>
   ...
</TabItem>
0 голосов
/ 06 октября 2013

попытаться найти решение с помощью события 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            
    }

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...