【问题标题】:ColumnDefinition doesn't expand until resizeColumnDefinition 在调整大小之前不会扩展
【发布时间】:2011-01-09 01:05:19
【问题描述】:

我有一个网格,其中一个列宽定义为*。 其他列定义为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 在调整大小之前为零。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我也有同样的怀疑,但我觉得我已经尝试过使所有可能的元素无效,但运气不佳。澄清一下:我从不设置宽度。列的宽度设置为自动,并且当重复按钮的可见性设置为可见时应该扩展为一个大小。我假设父元素是网格。在 Grid 上调用 InvalidateArrange(),在 CanScrollRight 属性设置器中无效。
    • 很难说问题出在您的示例代码中,但它看起来应该可以工作。我可以看到它可能产生这种效果的一个可能的地方是您的重复按钮中没有任何内容。通常文本应该在这里,否则按钮将“自动”到 0 宽度。祝你好运。
    • @risingape:Tri Q 通常关于默认按钮宽度是正确的,但是在您的情况下它可能不适用:只要您的 RepeatButtonScrollRight ControlTemplate 始终具有非零宽度,它就不会不管有没有内容。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多