Я создаю модальное диалоговое окно, которое содержит три основных части: TextBlock, содержащий инструкции, ContentControl для диалоговой панели и ContentControl для диалоговых кнопок. Каждая из этих частей содержится в отдельной строке сетки.
У меня есть некоторые конкретные ограничения, когда речь заходит о размере диалога. У меня проблема с инструкциями TextBlock. Я хочу, чтобы инструкции были такими же широкими, как ContentControl для диалоговой панели. Инструкции должны затем обернуться и расти вертикально по мере необходимости. Если инструкции не могут расти вертикально, то они должны начать расти горизонтально.
Получить инструкции для ширины ContentControl и роста по вертикали было просто. Часть, которую я не могу понять, это как заставить его расти горизонтально, когда он находится вне вертикального пространства. Сначала я хотел создать класс, который расширяет TextBlock и переопределяет MeasureOverride. Однако этот метод запечатан. В настоящее время я играю с идеей иметь диалоговое окно переопределения MeasureOverride для расчета доступного размера для блока инструкций.
Мне не хватает гораздо более простого способа сделать это? У кого-нибудь есть идеи получше, чем эта? Похоже, возиться с MeasureOverride будет много работы.
Вот пример кода, который даст вам общее представление о том, как устроен диалог:
<Window
x:Class="Dialogs.DialogWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="dialogWindow"
ShowInTaskbar="False"
WindowStyle="None"
AllowsTransparency="True"
Background="Transparent"
ResizeMode="NoResize"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterScreen">
<Border Style="{StaticResource WindowBorderStyle}" Margin="15">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock
Margin="25,5"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Text="{Binding Instructions}"
TextWrapping="Wrap"
Width="{Binding ElementName=panelContentControl, Path=ActualWidth, Mode=OneWay}"/>
<ContentControl
x:Name="panelContentControl"
Grid.Row="1"
Margin="25,5"
Content="{Binding PanelContent}"/>
<ContentControl
x:Name="buttonsContentControl"
Grid.Row="2"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Margin="25,5"
Content="{Binding ButtonsContent}"/>
</Grid>
</Border>
</Window>