2011-04-20 106 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> 
相关问题