隐藏TabControl标头

Ela*_*ich 34 c# wpf tabs tabcontrol

什么是编程方式(即不使用此问题中的样式,但使用代码)来隐藏TabControl标题?我会很高兴看到一个片段.

Eig*_*ite 79

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

  • 我也是,你知道为什么会有这种行为吗?我们期待标签容器完全消失. (7认同)
  • 这可行,但是当您尝试编辑TabItem内的内容时,它将无法正常工作.所以我发现我自己删除了Visibility ="Collapsed",编辑子项,然后将Visibility ="Collapsed"重新放回元素上.有点烦人. (4认同)

Tho*_*que 43

Style s = new Style();
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
tabControl.ItemContainerStyle = s;
Run Code Online (Sandbox Code Playgroud)


Anv*_*aka 8

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

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

我更喜欢使用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>
Run Code Online (Sandbox Code Playgroud)

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));
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 哇.我期待像`tab.Header.Visible = false`这样的一行,而不是一个庞大的XML +代码背后的怪物! (7认同)
  • 这显示了在MVVM设计模式中实现此目的的适当方法.虽然这不是问题所要求的,但对于那些在整个代码中强制执行模式的人来说,它仍然有用. (2认同)

Seb*_*ian 8

简单的XAML风格

<TabControl>
    <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
    </TabControl.ItemContainerStyle>
    ...
</TabControl>
Run Code Online (Sandbox Code Playgroud)