TabControl에서 특정 TabItem의 Header만을 숨기는 방법에 대해 문의드립니다.

아래 코드에서 Loading탭은 초기에만 보이고, 내부 프로세스가 완료되면 자동으로 Tab#1으로 이동하는 로직을 구현하였습니다.

하지만 TabControl에서 TabHeader 전체를 숨기는 방법은 많이 있는 것 같은데, 제가 원하는 기능이 없는 것 같아서 이렇게 글을 남기게 되었습니다.

  • 특정 TabItem(Loading)의 Header만을 숨기기
  • 전체 TabItem의 Header의 Click event를 disable처리하기

관련하여 조언을 부탁드립니다.

            <TabControl x:Name="TabControl"
                        TabStripPlacement="Left"
                        Visibility="Visible"
                        SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}">     
        
                <!--Loading-->
                <TabItem Header="Loading"
                         Name="Loading">                 
                </TabItem>

                <!--Tab#1-->
                <TabItem Header="Tab#1"
                         Name="Tab#1Tab">
                </TabItem>

                <!--Tab#2-->
                <TabItem Header="Tab#2"
                         Name="Tab#2Tab">
                </TabItem>

                <!--Tab#3-->
                <TabItem Header="Tab#3"
                         Name="Tab#3Tab">
                </TabItem>            
            </TabControl>
        </StackPanel>
    </DockPanel>
</Page>

읽어주셔서 감사합니다.

좋아요 1

ItemsSource 속성을 이용한 방법을 문의 주신건가요? 그렇다면 ItemTemplate 속성을 통해 관련 기능을 구현할 수 있고 그게 아니라면 다음처럼 할 수 있습니다.

아래 코드는 동작의 예시입니다.

...
        <TabControl x:Name="tab">
            <TabItem x:Name="lodingTabHeader" Header="Loading">
                <TextBlock x:Name="lodingLabel" />
            </TabItem>
            <TabItem
                x:Name="tab1"
                Header="Tab#1"
                IsEnabled="False" />
            <TabItem Header="Tab#2" IsEnabled="False" />
            <TabItem Header="Tab#3" IsEnabled="False" />
        </TabControl>
...
...
        protected override async void OnActivated(EventArgs e)
        {
            base.OnActivated(e);

            for (var i = 3; i > 0; i--)
            {
                lodingLabel.Text = $"{i}초 남았습니다.";

                await Task.Delay(1000);
            }
            lodingLabel.Text = $"0초 남았습니다.";
            lodingTabHeader.Visibility = Visibility.Collapsed;

            foreach (TabItem tabItem in tab.Items)
                tabItem.IsEnabled = true;
            tab.SelectedItem = tab1;
        }
...

소스코드

좋아요 3

@dimohy 조언해주셔서 감사합니다. 공유해주신 코드를 기반으로 아래와 같이 수정하였습니다.

                <TabItem Header="Loading"
                         Visibility="{Binding LoadingVisibility}"
                         Name="Loading">                
                </TabItem>

ReadyToStart를 통해서 Loading 준비가 완료되는지를 판단하고 이를 binding처리하였습니다.

        public bool ReadyToStart
        {
            get => _readyToStart;
            set
            {
                _readyToStart = value;
                OnPropertyChanged(nameof(ReadyToStart));
                if (ReadyToStart)
                    LoadingVisibility = Visibility.Collapsed;
                SelectedTabIndex = 1;
            }
        }
        private Visibility _loadingVisibility = Visibility.Visible;
        public Visibility LoadingVisibility
        {
            get =>_loadingVisibility; 
            set
            {
                _loadingVisibility = value;
                OnPropertyChanged(nameof(LoadingVisibility));
            }
        }
좋아요 2