Какой программный способ (т.е. не использовать стили как этот вопрос, но с использованием кода), чтобы скрыть заголовок TabControl
? Я буду рад за фрагмент.
Скрыть заголовок TabControl
Ответ 1
Style s = new Style();
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
tabControl.ItemContainerStyle = s;
Ответ 2
На самом деле, это очень прямо, чтобы скрыть полосу вкладок. Вы просто установите для каждого TabItem
Visibility
значение Collapsed
. Вы по-прежнему видите содержимое вкладки... просто не заголовок вкладки.
Ответ 3
Ну, есть несколько способов сделать это.
Самый уродливый способ: использовать 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>
С#
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));
}
}
}
}
Ответ 4
Простой стиль XAML
<TabControl>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</TabControl.ItemContainerStyle>
...
</TabControl>
Ответ 5
Я пробовал это в некотором коде, где я заполняю элементы вкладки вручную...
tabItemToAdd.Visibility = Visibility.Collapsed;
... но потом произошла странная вещь, когда во второй раз я очищал элементы управления вкладками, снова создавал элемент вкладки и использовал этот подход перед добавлением его в элемент управления вкладками, весь элемент вкладки и его содержимое были ушел, а не только заголовок вкладки. Так что у меня был успех с программным эквивалентом этого решения:
tabItemToAdd.Template = new ControlTemplate();
Ответ 6
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;
}
}