web-dev-qa-db-ja.com

TabControlヘッダーを非表示にする

TabControlヘッダーを非表示にするプログラムの方法(つまり、 この質問 のようなスタイルを使用せず、コードを使用)は何ですか?私はスニペットを喜んでいます。

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

実際、タブストリップを非表示にするのは非常に簡単です。各TabItems VisibilityCollapsedに設定するだけです。タブのコンテンツは表示されますが、タブヘッダー自体は表示されません。

82
EightyOne Unite

単純なXAMLスタイル

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

まあ、これを行うにはいくつかの方法があります。

醜い方法:VisualTreeHelperを使用してTabPanel(またはアイテムをホストするために使用する他のパネル)を見つけ、その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));
      }
    }
  }
}
8
Anvaka

C#を使用してTabItemのx:Nameを設定する場合、Visibilityを次のように操作することもできます。

tabItemName.Visibility = Visibility.Collapsed;
0
Ronnie

私は手動でタブ項目を入力するいくつかのコードでこれを試しました...

tabItemToAdd.Visibility = Visibility.Collapsed;

...しかし、2回目にタブコントロールのアイテムをクリアし、タブアイテムを再度作成し、このアプローチを使用してから、タブコントロールに追加する前に、奇妙なことが起こりました。タブアイテム全体とそのコンテンツはタブヘッダーだけでなく、なくなりました。したがって、プログラムによる同等の このソリューション で成功しました。

tabItemToAdd.Template = new ControlTemplate();
0
Eric Eggers