Question

My purpose is that: double-click the TabItem named "Tab" in the TabControl, then the TabControl will be folded, another double-click lead to unfolded. But after I move the GridSplitter and double-click the "Tab" to be folded, it don't work correctly that the the height of the column the TabControl in isn't equal to the height of the TabControl, in other word, GridSplitter don't follow the "TabControl".

enter image description here

.xaml

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto" MinHeight="20"/>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0">
            <Grid Grid.Column="1">
                <Label>
                    Nothing
                </Label>
            </Grid>
        </Grid>
        <GridSplitter Grid.Row="1" 
                      HorizontalAlignment="Stretch" 
                      VerticalAlignment="Center" 
                      Height="6" />
        <TabControl Grid.Row="2" 
                    TabStripPlacement="Bottom" 
                    VerticalAlignment="Stretch">
            <TabItem Header="Tab" 
                     MouseDoubleClick="TabItemDoubleCilck">
                <!--ListView-->
                <ListView Grid.Row="1"
                          xmlns:sys="clr-namespace:System;assembly=mscorlib">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="AA " 
                                        Width="100"
                                        DisplayMemberBinding="{Binding [0]}" />
                            <GridViewColumn Header="BB" 
                                        Width="100"
                                        DisplayMemberBinding="{Binding [1]}" />
                            <GridViewColumn Header="CC" 
                                        Width="100"
                                        DisplayMemberBinding="{Binding [2]}" />
                            <GridViewColumn Header="DD" 
                                        Width="100"
                                        DisplayMemberBinding="{Binding [3]}" />
                        </GridView>
                    </ListView.View>
                    <ListViewItem>
                        <x:Array Type="sys:String" >
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                        </x:Array>
                    </ListViewItem>
                    <ListViewItem>
                        <x:Array Type="sys:String" >
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                            <sys:String>2000/01/01</sys:String>
                        </x:Array>
                    </ListViewItem>
                </ListView>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication7
{
    /// <summary>
    /// MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        const double dBottomTabMinHeight = 20.0;

        private bool isBottomTabUnfold;

        public MainWindow()
        {
            InitializeComponent();
            isBottomTabUnfold = true;
        }

        private void TabItemDoubleCilck(object sender, MouseButtonEventArgs e)
        {
            TabItem tabItm = sender as TabItem;
            if (isBottomTabUnfold)
            {
                ((FrameworkElement)tabItm.Parent).Height = dBottomTabMinHeight;
            }
            else
            {
                ((FrameworkElement)tabItm.Parent).Height = Double.NaN;

            }
            isBottomTabUnfold = !isBottomTabUnfold;
        }
    }
}
Was it helpful?

Solution

try this, hope this is what you expected

    private void TabItemDoubleCilck(object sender, MouseButtonEventArgs e)
    {
        TabItem tabItm = sender as TabItem;
        if (isBottomTabUnfold)
        {
            ((FrameworkElement)tabItm.Parent).Height = dBottomTabMinHeight;
            ((FrameworkElement)tabItm.Parent).VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
        }
        else
        {
            ((FrameworkElement)tabItm.Parent).Height = Double.NaN;
            ((FrameworkElement)tabItm.Parent).VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
        }
        isBottomTabUnfold = !isBottomTabUnfold;
    }

edit:

like this then?

    private void TabItemDoubleCilck(object sender, MouseButtonEventArgs e)
    {
        TabItem tabItm = sender as TabItem;
        if (isBottomTabUnfold)
        {
            dUnfoldedHeight = ((FrameworkElement)tabItm.Parent).ActualHeight;
            ((FrameworkElement)tabItm.Parent).Height = dBottomTabMinHeight;
            rowTab.Height = new GridLength(1, GridUnitType.Auto);
        }
        else
        {
            ((FrameworkElement)tabItm.Parent).Height = double.NaN;
            rowTab.Height = new GridLength(dUnfoldedHeight);

        }
        isBottomTabUnfold = !isBottomTabUnfold;
    }

NB:

  • rowTab is the name of the 3rd rowdefinition, dUnfoldedHeight is a private member to track the height of the unfolded tab before it's folded.

  • you might find a weird behavior on dragging the splitter up when the tab is folded or when dragging the spliiter down until the tab is look like unfolded, to fix this you probably have to work with the DragDelta and DragCompleted event of the splitter to decide whether in the end the tab should be considered as folded or not

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top