Вот еще один пример, который показывает проблему с использованием Canvas
вместо ScrollViewer
:
<Canvas>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" x:Name="textBlock1" Text="{Binding ElementName=textBlock1, Path=ActualWidth}"/>
<TextBlock Grid.Column="1" x:Name="textBlock2" Text="{Binding ElementName=textBlock2, Path=ActualWidth}"/>
<TextBlock Grid.Row="1" Grid.ColumnSpan="3" Width="300"/>
</Grid>
</Canvas>
В этом примере показано, что при наличии неограниченного пространства первые два столбца неправильно расширяются на 33%.У меня нет рабочего эталонного источника для отладки этого прямо сейчас, потому что SP1 сломал эталонный источник .NET4, но откровенно указывать это на строку в исходном файле не поможет, поэтому давайте не будем идти по этому пути.
Вместо этого, мы согласимся, что это определенно ошибка, и мы можем доказать, что это ошибка, устанавливая Grid.MaxWidth
с постепенно увеличивающимися значениями, а ширина двух столбцов остается равной 100, независимо от того, насколько она велика.Но если вы оставите Grid.MaxWidth
неустановленным и поместите Grid
внутри Canvas
, тогда значение во время измерения будет double.PositiveInfinity
, и это значение будет иметь ширину столбца 133. В результате мы можем предположить, что некоторые какОсобый случай ограничения размера положительной бесконечности не обрабатывается правильно во время вычислений размера столбца.
К счастью, тот же самый эксперимент предлагает простой обходной путь: просто предоставьте абсурдно большое значение для Grid.MaxWidth
, когда Grid
используется внутри другого элемента управления, который предоставляет ему неограниченное пространство, например ScrollViewer
или Canvas
.Я рекомендую что-то вроде:
<Grid MaxWidth="1000000">
Этот подход позволяет избежать ошибки, предотвращая ограничение размера, имеющее пробматическое значение положительной бесконечности, при этом практически достигая того же эффекта.
Но это:
<Grid MaxWidth="{x:Static sys:Double.PositiveInfinity}">
вызовет ошибку.