Inf*_*ris 13 wpf height tabcontrol multibinding
有没有办法让tabcontrol采取最大标签项的大小(实际上,tabitem的内容)?
由于tabcontrol没有指定特定的大小,因此它应该自动调整大小:它可以正确地执行此操作,但是当您切换选项卡时,它会自动将其自身调整为当前所选选项卡内容的高度(和宽度).
我不希望调整大小发生,让tabcontrol假设最大项目的高度,但仍然让它自动调整大小.
有线索吗?我尝试数据绑定到Height使用多绑定作为内容的每个元素ActualHeight的Items属性,并对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)
实际上,我认为这更容易解决.因为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| 归档时间: |
|
| 查看次数: |
12083 次 |
| 最近记录: |