Let WPF Tabcontrol height assume height of largest item? Let WPF Tabcontrol height assume height of largest item? wpf wpf

Let WPF Tabcontrol height assume height of largest item?


Yes it can be done: reuse-grid-rowdefinitions-for-each-tabitem

Example:

    <TabControl Grid.IsSharedSizeScope="True">        <TabItem Header="Tab 1">            <Grid >                <Grid.RowDefinitions>                    <RowDefinition SharedSizeGroup="xxx"/>                </Grid.RowDefinitions>            </Grid>        </TabItem>        <TabItem Header="Tab 2">            <Grid >                <Grid.RowDefinitions>                    <RowDefinition SharedSizeGroup="xxx"/>                </Grid.RowDefinitions>            </Grid>        </TabItem>   </TabControl>


The problem is that the TabControl unloads and reloads its content as you switch tabs. Therefore it only knows about the size of the content in the currently active tab. You should be able to change the TabControl such that it never destroys its children, and they are always present (but maybe hidden).

This blog post by Eric Burke should get you started. From what I can tell by skimming his post, you will need to change it such that:

  • All children are loaded when the TabControl is loaded.
  • Children are hidden rather than collapsed when they are inactive


Actually, it was easier to solve that I thought.Since I had a controltemplate for the TabControl anyway, I set the height of the ContentPresenter presenting the selected tab content. I do this using a converter that binds to the items of the TabControl, measures them if necessary (using Measure) and checks DesiredSize for the size I need.

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    {        var items = value as ItemCollection;        if (items == null)            return null;        double max = 0;        foreach (TabItem item in items)        {            var content = item.Content as FrameworkElement;            if (content == null) continue;            if (!content.IsMeasureValid)                content.Measure(new Size(int.MaxValue, int.MaxValue));            var height = content.DesiredSize.Height;            if (max < height)                max = height;        }        return max;    }

That works just fine, with some caveats:

  • every tab content should be a FrameworkElement
  • the contents don't change size once they are loaded (because the converter is only called when the Items property changes, ie just once).