TabControl
ヘッダーを非表示にするプログラムの方法(つまり、 この質問 のようなスタイルを使用せず、コードを使用)は何ですか?私はスニペットを喜んでいます。
Style s = new Style();
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
tabControl.ItemContainerStyle = s;
実際、タブストリップを非表示にするのは非常に簡単です。各TabItem
s Visibility
をCollapsed
に設定するだけです。タブのコンテンツは表示されますが、タブヘッダー自体は表示されません。
単純なXAMLスタイル
<TabControl>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</TabControl.ItemContainerStyle>
...
</TabControl>
まあ、これを行うにはいくつかの方法があります。
醜い方法: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));
}
}
}
}
C#を使用してTabItemのx:Nameを設定する場合、Visibilityを次のように操作することもできます。
tabItemName.Visibility = Visibility.Collapsed;
私は手動でタブ項目を入力するいくつかのコードでこれを試しました...
tabItemToAdd.Visibility = Visibility.Collapsed;
...しかし、2回目にタブコントロールのアイテムをクリアし、タブアイテムを再度作成し、このアプローチを使用してから、タブコントロールに追加する前に、奇妙なことが起こりました。タブアイテム全体とそのコンテンツはタブヘッダーだけでなく、なくなりました。したがって、プログラムによる同等の このソリューション で成功しました。
tabItemToAdd.Template = new ControlTemplate();