programing

TabControl 헤더 숨기기

elecom 2023. 4. 28. 20:12
반응형

TabControl 헤더 숨기기

다음을 숨기기 위한 프로그래밍 방식(, 이 질문에서와 같이 스타일을 사용하지 않고 코드를 사용함)은 무엇입니까?TabControl헤더?토막글을 주시면 고맙겠습니다.

사실 탭 스트립을 숨기는 것은 매우 간단합니다.당신은 그냥 각각을 설정합니다.TabItems Visibility로.Collapsed탭 내용이 아직 표시됩니다.탭 헤더 자체가 아닙니다.

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

단순 XAML 스타일

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

이렇게 하는 데는 여러 가지 방법이 있습니다.

가장 추악한 방법:Visual Tree Helper를 사용하여 TabPanel(또는 항목을 호스트하는 데 사용하는 다른 패널)을 찾은 후 해당 Visibility 속성을 Visibility로 설정합니다.무너졌습니다.왜 못생겼어요?만약 당신이 충분히 주의하지 않았다면, 여기서 성가신 버그를 몇 개 만들거나 '무해한' 스타일 업데이트로 이 접근 방식을 깨는 것은 쉽습니다.

저는 뒤에 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));
      }
    }
  }
}

탭 항목을 수동으로 채우는 코드로 시도했습니다.

tabItemToAdd.Visibility = Visibility.Collapsed;

...그런데 두 번째로 탭 컨트롤의 항목을 지우고 탭 항목을 다시 만든 다음 탭 컨트롤에 추가하기 전에 이 방법을 사용하면 탭 헤더뿐만 아니라 전체 탭 항목과 해당 내용이 사라집니다.그래서솔루션과 동일한 프로그램을 통해 성공을 거두었습니다.

tabItemToAdd.Template = new ControlTemplate();

C#을 사용하고 TabItem에 대해 x:Name을 설정하면 다음과 같이 가시성을 조작할 수도 있습니다.

tabItemName.Visibility = Visibility.Collapsed;
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;
    }
}

언급URL : https://stackoverflow.com/questions/1465443/hide-the-tabcontrol-header

반응형