隐藏TabControl标头

时间:2009-09-23 11:35:03

标签: c# wpf tabs tabcontrol

编程方式是什么(即不使用this question中的样式,而是使用代码)来隐藏TabControl标题?我会很高兴获得一个片段。

7 个答案:

答案 0 :(得分:72)

实际上,隐藏标签条非常简单。您只需将每个TabItem Visibility设置为Collapsed即可。您仍然可以看到标签内容,...而不是标签标题本身。

答案 1 :(得分:42)

Style s = new Style();
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
tabControl.ItemContainerStyle = s;

答案 2 :(得分:7)

嗯,有几种方法可以做到这一点。

最丑陋的方法:使用VisualTreeHelper查找TabPanel(或用于托管项目的任何其他Panel),并将其Visibility属性设置为Visibility.Collapsed。为什么难看?在这里创建一些烦人的错误很容易,或者如果你不够小心的话,用“无害”的风格更新来打破这种方法......

我更喜欢使用Xaml和后面的代码组合。您可以将TabItem的可见性绑定到视图模型属性,也可以将TabPanel的可见性绑定到视图模型属性。在这两种情况下,您都必须覆盖样式(ItemContainer的样式或整个TabControl的样式)。在这两种情况下,您都有视图模型。现在,要切换选项卡标题的可见性,只需更新视图模型中的属性即可。以下是TabItems的示例:

<强> XAML

<Window x:Class="WpfApplication5.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="Tab Settings"
        Height="300"
        Width="300">
  <Window.Resources>
    <local:TabControlViewModel x:Key="tabVM" />
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
  </Window.Resources>
  <Grid>
    <TabControl DataContext="{StaticResource tabVM}">
      <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
          <Setter Property="Visibility"
                  Value="{Binding TabHeaderVisible, Converter={StaticResource booleanToVisibilityConverter}}" />
        </Style>
      </TabControl.ItemContainerStyle>
      <TabItem Header="Tab 1">
        <StackPanel>
          <TextBlock Text="Content" />
          <Button Content="Toggle Header"
                  Click="ToggleHeaderClick" />
        </StackPanel>
      </TabItem>
      <TabItem Header="Tab 2 Header">
        <TextBlock Text="Tab 2 Content" />
      </TabItem>
    </TabControl>
  </Grid>
</Window>

<强> C#

using System.ComponentModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication5
{
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    private void ToggleHeaderClick(object sender, RoutedEventArgs e)
    {
      var tabControlVM =
        ((FrameworkElement)sender).DataContext as TabControlViewModel;
      if (tabControlVM != null)
      {
        tabControlVM.TabHeaderVisible = !tabControlVM.TabHeaderVisible;
      }
    }
  }

  public class TabControlViewModel : INotifyPropertyChanged
  {
    private bool _tabHeaderVisible = true;

    public ICommand ToggleHeader
    {
      get; private set;
    }

    public bool TabHeaderVisible
    {
      get { return _tabHeaderVisible; }
      set
      {
        _tabHeaderVisible = value;
        OnPropertyChanged("TabHeaderVisible");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string name)
    {
      var changed = PropertyChanged;
      if (changed != null)
      {
        changed(this, new PropertyChangedEventArgs(name));
      }
    }
  }
}

答案 3 :(得分:5)

简单的XAML样式

<TabControl>
    <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
    </TabControl.ItemContainerStyle>
    ...
</TabControl>

答案 4 :(得分:0)

我在一些代码中试过这个,我手动填充标签项...

tabItemToAdd.Visibility = Visibility.Collapsed;

...但后来我发生了一件奇怪的事情,第二次我清除了标签控件的项目,再次创建标签项并使用这种方法,然后将其添加到标签控件,整个标签项和它的内容已经消失,而不仅仅是标题页。所以我在程序上等同于this solution

取得了成功
tabItemToAdd.Template = new ControlTemplate();

答案 5 :(得分:0)

如果使用C#并为TabItem设置x:Name,则还可以像这样操作Visibility:

tabItemName.Visibility = Visibility.Collapsed;

答案 6 :(得分:-3)

<强> C#

private void TabItemControl_MouseEnter(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 100; }}

private void TabItemControl_MouseLeave(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }}

private void TabAllControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }}