ColumnDefinition не расширяется до изменения размера
У меня есть сетка, где одна ширина столбца определяется как *
, Другие столбцы определены как Auto
, Колонна с *
-definition содержит пользовательский контроль, полученный из 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 ответа
Вам нужно будет вызвать изменение макета после изменения ширины столбца. Используйте InvalidateArrange() для соответствующего родительского элемента. Будьте осторожны, чтобы избежать бесконечных циклов.
InvalidateArrange
Это хороший ответ, но, к сожалению, он молча игнорируется в то время, когда фактически осуществляется контроль. Таким образом, хитрость заключается в том, чтобы позвонить после завершения аранжировки.
Это может сработать (я не пробовал):
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
grid.InvalidateArrange();
}));
Если это не работает, вы можете попробовать вызвать InvalidateArrange и / или InvalidateMeasure для RepeatButton, также в рамках обратного вызова Dispatcher.BeginInvoke.