2011-04-20 140 views

回答

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

您可以通過添加標籤,這樣做到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 
} 

希望這有助於。

+0

如果我們還要設置標籤的* Content *屬性,我們是否需要設置標籤的*名稱*? – 2015-01-01 21:18:38

+0

不,不需要TabItem的名稱。只要Label具有關聯的單擊事件處理程序,它就可以工作。 – 2015-01-01 23:20:29

9

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

我用的TabControl的(XAML)SelectionChanged事件

<TabControl SelectionChanged="TabControl_SelectionChanged"> 

後面的代碼(C#):

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

這不是點擊自己,而是其令人耳目一新的東西的工作..

+1

這種類型的解決方案給了我一個問題,因爲只要tabcontrol中的控件改變選擇,它就會觸發,而不僅僅是tabcontrol本身的選擇。 – 2015-07-14 22:30:14

-1

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

希望這將是有益的

7

可以在TabControl的使用SelectionChanged事件,並使用開關的情況下做任何你喜歡的。

// 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; 
     } 
    } 
0

您可以通過添加標籤的標題屬性在TabControl的每個 TabItem的做到這一點。然後你可以爲標籤設置一個事件。

該解決方案工作得很好;但是,「標籤」具有邊距屬性,可以防止「MouseLeftButtonDown」處理程序被觸發,除非用戶單擊標籤時不起作用。此外,由於標籤填充,看起來其他選項卡的樣式會受到影響。

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

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