让WPF Tabcontrol高度假设最大项目的高度?

Inf*_*ris 13 wpf height tabcontrol multibinding

有没有办法让tabcontrol采取最大标签项的大小(实际上,tabitem的内容)?

由于tabcontrol没有指定特定的大小,因此它应该自动调整大小:它可以正确地执行此操作,但是当您切换选项卡时,它会自动将其自身调整为当前所选选项卡内容的高度(和宽度).

我不希望调整大小发生,让tabcontrol假设最大项目的高度,但仍然让它自动调整大小.

有线索吗?我尝试数据绑定到Height使用多绑定作为内容的每个元素ActualHeightItems属性,并对Tabcontrol 的属性和属性进行绑定.但是,唉,ActualHeight内容元素总是0.

        <TabItem Header="Core" > 
            <Grid Margin="5">
                <Grid.Height>
                    <MultiBinding Converter="{Converters1:AllTabContentEqualHeightConverter}">
                        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
                        <Binding Path="Items" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
                    </MultiBinding>
                </Grid.Height>

            ...
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

小智 22

是的,可以这样做:reuse-grid-rowdefinitions-for-each-tabitem

例:

    <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>
Run Code Online (Sandbox Code Playgroud)

  • 关键是要包括`Grid.IsSharedSizeScope ="True",我第一次错过了 - 没有它对我来说没有任何改变.另请注意,您不必在网格中使用"TabControl"来应用该值. (3认同)

Ken*_*art 6

问题是在TabControl切换选项卡时卸载并重新加载其内容.因此,它只知道当前活动选项卡中内容的大小.您应该能够更改TabControl,使其永远不会破坏其子项,并且它们始终存在(但可能隐藏).

Eric Burke的这篇博文应该可以帮到你.通过略读他的帖子,我可以告诉你,你需要改变它:

  • 所有孩子在装载时都会TabControl被加载.
  • 孩子们在不活动时会被隐藏而不是崩溃

  • 断链.:( (2认同)

Inf*_*ris 5

实际上,我认为这更容易解决.因为TabControl无论如何我有一个控制模板,我设置了ContentPresenter呈现所选标签内容的高度.我这样做是使用一个绑定到项目的转换器,TabControl必要时测量它们(使用Measure)并检查DesiredSize我需要的大小.

    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;
    }
Run Code Online (Sandbox Code Playgroud)

这很好,有一些警告:

  • 每个标签内容应该是一个 FrameworkElement
  • 加载后内容不会改变大小(因为仅在Items属性更改时调用转换器,即只调用一次).