簡體   English   中英

如何在WPF中處理TabItem單擊事件?

[英]how to handle TabItem single click event in WPF?

在我的應用程序中,我使用了WPF TabControl我想處理TabItem click事件。 我如何實現它?

您可以通過向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#/ Code Behind

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

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

希望這可以幫助。

這是一個古老的問題,但我在相同的情況下找到答案。

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

<TabControl SelectionChanged="TabControl_SelectionChanged">

代碼背后(C#):

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

這不是點擊他自己,而是為了讓人耳目一新。

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

將標題包裹在無模板按鈕中。

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

您可以通過向tabcontrol中每個tabitem的header屬性添加標簽來完成此操作。 然后,您可以為標簽設置事件。

解決方案效果很好; 但是,“label”具有margin屬性,可以防止“MouseLeftButtonDown”處理程序被觸發,除非用戶單擊標簽為dead。 此外,由於標簽填充,看起來其余選項卡的樣式會受到影響。

您可以通過覆蓋標簽的默認邊距/填充屬性來緩解這種情況......或者更簡單地說,使用TextBlock。

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

請注意,雖然d.moncada和其他人提供的答案解決了這個問題,但問題本身可能不是預期的。 知道用戶何時點擊選項卡不同於知道用戶何時最前面的選項卡 - 可以通過單擊選項卡來完成,但也可以通過其他方式實現。 例如,如果單擊最前面的選項卡,然后使用左/右箭頭,您可以在不單擊鼠標的情況下將另一個選項卡添加到前面 - 在這種情況下不會調用鼠標左鍵按鈕事件(正如你所料)。

嘗試使用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            
    }

希望這會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM