3

1 つの列幅が として定義されているグリッドがあり*ます。他の列は として定義されAutoます。-definitionを持つ列には、*Panel から派生した usercontrol が含まれており、これも を実装していIScrollInfoます。この間、コントロールの可視性は別の列でMeasureOverride可視に設定されます (それ以外の場合、の可視性は折りたたみに設定されます)。RepeatButtonRepeatButton

これにより、列が拡張されることはありません。これは、ウィンドウのサイズを変更したときにのみ発生します。簡単な例:

<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、含まれている列の はサイズ変更されるまでゼロです。

何か案は?

4

2 に答える 2

0

列幅を変更した後、レイアウトの変更をトリガーする必要があります。適切な親要素でInvalidateArrange()を使用します。無限サイクルを避けるように注意してください。

于 2010-01-25T10:25:50.440 に答える
0

InvalidateArrange良い答えですが、残念ながら、コントロールが実際に配置されている間は黙って無視されます。なのでアレンジが終わってから呼び出すのがコツです。

これはうまくいくかもしれません(私は試していません):

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

これが機能しない場合は、Dispatcher.BeginInvoke コールバック内でも、RepeatButton で InvalidateArrange および/または InvalidateMeasure を呼び出してみてください。

于 2010-03-03T18:23:17.263 に答える