По сути, вы пытаетесь использовать два разных режима макета, поэтому вам просто нужно установить два разных состояния в вашем макете, а затем добавить привязки или триггеры для переключения между ними в точке, когда вы хотите переключить режимы (то есть ширину). = 200). Использование Grid является наиболее гибким и дает вам гораздо больший контроль над относительными размерами, но требует больше настроек и будет работать лучше всего в ControlTemplate или DataTemplate, где вы можете использовать триггеры для одновременной установки нескольких вещей на основе условия.
Вот более компактный пример использования UniformGrid с некоторыми привязками и конвертером. Я удалил фиксированный размер изображения - попробуйте Stretch = "Fill", если вам важнее ширина заливки, чем соотношение сторон. Я также изменил одну StackPanel на DockPanel, чтобы поддерживать вертикальное растяжение для его дочерних элементов, и добавил фон в один из TextBlocks просто для того, чтобы показать, какую ширину он действительно получает:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Left" />
<DockPanel Grid.Column="1" Margin="5,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="Now here's a silly poem for you." DockPanel.Dock="Top"/>
<UniformGrid Rows="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth, Converter={x:Static local:LayoutModeConverter.Row}, ConverterParameter=200}"
Columns="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth, Converter={x:Static local:LayoutModeConverter.Column}, ConverterParameter=200}">
<Image Source="Image.jpg" />
<StackPanel Orientation="Vertical">
<TextBlock TextWrapping="WrapWithOverflow" Text="Roses are red." Background="Red" />
<TextBlock TextWrapping="WrapWithOverflow" Text="Violets are blue." />
<TextBlock TextWrapping="WrapWithOverflow" Text="You belong in a zoo." />
</StackPanel>
</UniformGrid>
</DockPanel>
</Grid>
И конвертер:
public class LayoutModeConverter : IValueConverter
{
public static readonly LayoutModeConverter Row = new LayoutModeConverter { RowMode = true };
public static readonly LayoutModeConverter Column = new LayoutModeConverter { RowMode = false };
public bool RowMode { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double width = System.Convert.ToDouble(value);
double targetWidth = System.Convert.ToDouble(parameter);
if (RowMode)
return width > targetWidth ? 1 : 2;
else
return width > targetWidth ? 2 : 1;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}