我有一个网格,其中一个列宽定义为*
。
其他列定义为Auto
。
具有*
- 定义的列包含从Panel派生的用户控件,该用户控件也实现IScrollInfo
。
在此控制期间,MeasureOverride
可见性设置为在另一列的RepeatButton
上可见(RepeatButton
的可见性另外设置为折叠)。
这不会导致列扩展。这只会在我调整窗口大小时发生。 一个简化的例子:
<DockPanel LastChildFill="True">
<Grid DockPanel.Dock="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="TabItemColumn"/>
<ColumnDefinition x:Name="ScrollRightColumn" Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="PART_ScrollViewer"
Grid.Column="0"
Margin="-1,0,0,0"
Height="32"
CanContentScroll="True"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden"
HorizontalAlignment="Left">
<local:TabPanel
x:Name="tabPanel"
HorizontalAlignment="Left"
IsItemsHost="True" />
</ScrollViewer>
<RepeatButton Style="{StaticResource RepeatButtonScrollRight}"
Visibility="{Binding ElementName=tabPanel, Path=CanScrollRight, Converter={StaticResource _localBooleanConverter}}"
Grid.Column="1">
</RepeatButton>
RepeatButton
的可见性被正确触发,据我所知,它实际上已呈现,但在调整大小之前,包含列的ActualWidth
为零。
有什么想法吗?
答案 0 :(得分:0)
更改列宽后,您需要触发布局更改。在正确的父元素上使用InvalidateArrange()。注意避免无限循环。
答案 1 :(得分:0)
InvalidateArrange
是一个很好的答案,但不幸的是,在实际安排控件的过程中,它会被忽略。所以诀窍是在安排完成后调用它。
这可能有效(我还没试过):
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
grid.InvalidateArrange();
}));
如果这不起作用,您可以尝试在RepeatButton上调用InvalidateArrange和/或InvalidateMeasure,也可以在Dispatcher.BeginInvoke回调中调用。