在调整大小之前,ColumnDefinition不会展开

时间:2010-01-25 10:11:54

标签: wpf grid wpf-controls column-width actualwidth

我有一个网格,其中一个列宽定义为*。 其他列定义为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为零。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

更改列宽后,您需要触发布局更改。在正确的父元素上使用InvalidateArrange()。注意避免无限循环。

答案 1 :(得分:0)

InvalidateArrange是一个很好的答案,但不幸的是,在实际安排控件的过程中,它会被忽略。所以诀窍是在安排完成后调用它。

这可能有效(我还没试过):

Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
  grid.InvalidateArrange();
}));

如果这不起作用,您可以尝试在RepeatButton上调用InvalidateArrange和/或InvalidateMeasure,也可以在Dispatcher.BeginInvoke回调中调用。