В настоящее время я разрабатываю макет приложения WPF и, похоже, он немного загвоздка в макете одного из моих элементов управления. Этот элемент управления динамически изменяет размер, поэтому он должен соответствовать размеру области просмотра, частью которой он является. Проблема, с которой я сталкиваюсь, является очень визуальной проблемой, поэтому я приложу все усилия, чтобы описать ее. Вот как это выглядит на данный момент:
альтернативный текст http://gallery.me.com/theplatz/100006/Capture/web.png?ver=12472534170001
Область под каждым из заголовков «Col N Row X» представляет собой текстовый блок, в который будет помещен текст различной длины. Чтобы сделать TextBlock действительно переносимым, я нашел здесь решение для stackoverflow, в котором говорится, что необходимо привязать ширину текстового блока к ширине столбца. Вот фрагмент определения Grid вместе с определением для первого столбца:
<!-- Change Detail Contents Grid -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="270" Width="2*" />
<ColumnDefinition MinWidth="160" Width="*" />
<ColumnDefinition MinWidth="160" Width="*" />
<ColumnDefinition MinWidth="160" Width="*" />
</Grid.ColumnDefinitions>
<!--
We bind the width of the textblock to the width of this border to make sure things resize correctly.
It's important that the margin be set to 1 larger than the margin of the textblock or else you'll end
up in an infinate loop
-->
<Border Grid.Column="0" Margin="6" Name="FirstBorder" />
<Border Grid.Column="0" BorderThickness="0,0,1,0" BorderBrush="{DynamicResource ColumnBorderBrush}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<Border Style="{DynamicResource DetailHeadingBorder}">
<TextBlock Text="Col 1 Row 1" Style="{DynamicResource DetailHeadingText}" />
</Border>
<TextBlock Text="{Binding IsReason, ElementName=ChangeDetailRoot}" Style="{DynamicResource DetailText}" Width="{Binding ActualWidth, ElementName=FirstBorder}" />
</StackPanel>
<StackPanel Grid.Row="1">
<Border Style="{DynamicResource DetailHeadingBorder}">
<TextBlock Text="Col 1 Row 2" Style="{DynamicResource DetailHeadingText}" />
</Border>
<TextBlock Text="{Binding WasReason, ElementName=ChangeDetailRoot}" Style="{DynamicResource DetailText}" Width="{Binding ActualWidth, ElementName=FirstBorder}" />
</StackPanel>
</Grid>
</Border>
</Grid>
Все отлично меняется при увеличении ширины окна / области просмотра. Проблема становится очевидной, когда ширина уменьшается. Если вы вдруг перейдете от развернутого к исходному размеру, все столбцы «танцуют» обратно до указанного размера. Под этим я подразумеваю то, что вы можете наблюдать, как уменьшается размер каждого столбца, поскольку он пропорционально уменьшается до своего меньшего размера. Я обнаружил, что это напрямую вызвано
Width="{Binding ActualWidth, ElementName=FirstBorder}"
на каждом из текстовых блоков. Проблема также становится заметно хуже, чем больше этих элементов управления на экране одновременно. Но без этой строки текст внутри каждого из текстовых блоков будет продолжать расти вправо, чем больше текста будет добавлено, а не будет перенесено в столбец.
Есть ли лучший способ выполнить то, что я пытаюсь сделать? Используя HTML / CSS, это было бы довольно просто сделать. Я часами гуглял и просматривал stackoverflow, чтобы найти ответ на этот вопрос.
Я пришел из глубокого фона HTML / CSS, поэтому, если это не то, что WPF должен быть хорош, пожалуйста, дайте мне знать.