Change TabPanel to Visibility.Collapsed in Code-Behind

Dyr Fenrir 21 Reputation points
2023-12-27T12:44:08.9166667+00:00

I am currently experiencing the exact following issue: WPF TabControl collapsed tab headers are not completely hidden (when I collapse the TabItems, I still see a gray line of a few pixels where the TabControl header is located)

But I cannot do it in XAML (I think), because I need to hide the TabPanel only when the application goes into full screen, so when the application exits full screen, the TabPanel should go back to visible.

I am less experienced in styles, how would I set the TabPanel of my TabControl to Visibility.Collapsed in code please?

Thank you for your time and help, it is greatly appreciated!

Developer technologies | Windows Presentation Foundation
Developer technologies | C#
Developer technologies | C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
0 comments No comments
{count} votes

Answer accepted by question author
  1. gekka 13,591 Reputation points MVP Volunteer Moderator
    2023-12-27T13:21:56.2533333+00:00
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    
    public partial class MainWindow : Window
    {
        TabControl tabControl;
        Style styleTabPanel;
    
        public MainWindow()
        {
            InitializeComponent();
    
            CheckBox chk = new CheckBox();
            {
                chk.Margin = new Thickness(5);
                chk.Content = "Test";
                chk.Checked += Chk_Checked;
                chk.Unchecked += Chk_Checked;
            }
    
            TabItem item = new TabItem() { Header = "Tab", Content = chk };
    
            tabControl = new TabControl();
            tabControl.RenderTransform = new ScaleTransform(5, 5);
            tabControl.Items.Add(item);
    
            this.Content = tabControl;
        }
    
        private void Chk_Checked(object sender, RoutedEventArgs e)
        {
            var chk = (CheckBox)sender;
            if (chk.IsChecked == true)
            {
                if (styleTabPanel == null)
                {
                    styleTabPanel = new Style(typeof(System.Windows.Controls.Primitives.TabPanel));
                    styleTabPanel.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
                }
                tabControl.Resources.Add(styleTabPanel.TargetType, styleTabPanel);
            }
            else
            {
                tabControl.Resources.Remove(styleTabPanel.TargetType);
            }
        }
    }
    
    1 person found this answer helpful.

1 additional answer

Sort by: Most helpful
  1. Hui Liu-MSFT 48,711 Reputation points Microsoft External Staff
    2023-12-28T03:37:07.4633333+00:00

    Hi,@Dyr Fenrir . Welcome to Microsoft Q&A .

    In that case, you could use the Window_StateChanged event in the code-behind to handle the state changes and update the visibility of your TabPanel. Xaml:

    <Window x:Class="TabPanelDemo.MainWindow"
           ...        Name="window"       StateChanged="Window_StateChanged">
       <TabControl x:Name="tabControl" Style="{DynamicResource TabControlStyle1}" >
                <TabItem >tab1</TabItem>
            </TabControl>
    </Window>
    

    Codebehind:

     private void Window_StateChanged(object sender, EventArgs e)
        {
          if (WindowState == WindowState.Maximized)
          {
            SetTabPanelVisibility(false);
          }
          else
          {
            SetTabPanelVisibility(true);
          }
        }
          private void SetTabPanelVisibility(bool isVisible)
          {
            var tabPanel = FindVisualChild<TabPanel>(tabControl);
            if (tabPanel != null)
            {
              tabPanel.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
            }
          }
    
          private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject
          {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
            {
              DependencyObject child = VisualTreeHelper.GetChild(parent, i);
    
              if (child is T result)
              {
                return result;
              }
    
              T childResult = FindVisualChild<T>(child);
              if (childResult != null)
              {
                return childResult;
              }
            }
            return null;
          }
    
    
    

    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

    1 person found this answer helpful.

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.