ColumnDefinition не расширяется до изменения размера - PullRequest
3 голосов
/ 25 января 2010

У меня есть сетка, где одна ширина столбца определяется как *. Другие столбцы определены как 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 голосов
/ 03 марта 2010

InvalidateArrange - хороший ответ, но, к сожалению, он молчаливо игнорируется во время фактической организации контроля. Так что хитрость заключается в том, чтобы позвонить после завершения аранжировки.

Это может сработать (я не пробовал):

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

Если это не работает, вы можете попытаться вызвать InvalidateArrange и / или InvalidateMeasure для RepeatButton, также в рамках обратного вызова Dispatcher.BeginInvoke.

0 голосов
/ 25 января 2010

Вам нужно будет вызвать изменение макета после изменения ширины столбца. Используйте InvalidateArrange () на соответствующем родительском элементе. Будьте осторожны, чтобы избежать бесконечных циклов.

...