有没有办法让tabcontrol采取最大标签项的大小(实际上,tabitem的内容)?
由于tabcontrol没有指定特定的大小,因此它应该自动调整大小:它可以正确地执行此操作,但是当您切换选项卡时,它会自动将其自身调整为当前所选选项卡内容的高度(和宽度).
我不希望调整大小发生,让tabcontrol假设最大项目的高度,但仍然让它自动调整大小.
有线索吗?我尝试数据绑定到Height
使用多绑定作为内容的每个元素ActualHeight
的Items
属性,并对Tabcontrol 的属性和属性进行绑定.但是,唉,ActualHeight
内容元素总是0.
...
可以这样做吗?
是的,可以这样做:reuse-grid-rowdefinitions-for-each-tabitem
例:
问题是在TabControl
切换选项卡时卸载并重新加载其内容.因此,它只知道当前活动选项卡中内容的大小.您应该能够更改TabControl,使其永远不会破坏其子项,并且它们始终存在(但可能隐藏).
Eric Burke的这篇博文应该可以帮到你.通过略读他的帖子,我可以告诉你,你需要改变它:
所有孩子在装载时都会TabControl
被加载.
孩子们在不活动时会被隐藏而不是崩溃
实际上,我认为这更容易解决.因为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; }
这很好,有一些警告:
每个标签内容应该是一个 FrameworkElement
加载后内容不会改变大小(因为仅在Items属性更改时调用转换器,即只调用一次).