Итак, я пытаюсь создать форму, которая будет автоматически пропорционально масштабироваться вверх и вниз в зависимости от доступной ширины родительского контейнера и тех же процентных соотношений столбцов, например:
Будет и другой окружающий контент, который также необходимо масштабировать, например изображения и кнопки (которые не будут в одной сетке), и, судя по тому, что я читал до сих пор, использование Viewbox - это лучший способ.
Однако, когда я помещаю свою сетку в окно просмотра с помощью Stretch = "Uniform", текстовое поле контролирует каждое сворачивание до минимальной ширины, которая выглядит следующим образом:
Если я увеличиваю ширину контейнера, все масштабируется, как ожидалось (хорошо), но текстовые поля по-прежнему свернуты до минимально возможной ширины (плохо):
Если я ввожу какой-либо контент в текстовые поля, они увеличивают свою ширину, чтобы содержать текст:
... но я не хочу такого поведения - я хочу, чтобы ширина элемента Textbox была привязана к ширине столбца сетки, а НЕ зависела от содержимого.
Теперь я рассмотрел множество вопросов SO, и этот вопрос ближе всего к тому, что мне нужно: Как автоматически масштабировать размер шрифта для группы элементов управления?
... но он по-прежнему не касался конкретно поведения ширины текстового поля (когда он взаимодействует с поведением окна просмотра), что, по-видимому, является основной проблемой.
Я пробовал множество вещей - разные настройки HorizontalAlignment = "Stretch" и так далее, но пока ничего не помогло. Вот мой XAML:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<StackPanel.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Silver" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</StackPanel.Background>
<Viewbox Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Field A" Grid.Column="0" Grid.Row="0" />
<TextBox Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch"></TextBox>
<Label Content="Field B" Grid.Column="2" Grid.Row="0" />
<TextBox Grid.Column="3" Grid.Row="0" HorizontalAlignment="Stretch"></TextBox>
</Grid>
</Viewbox>
<Label Content="Other Stuff"/>
</StackPanel>
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" Height="100" Width="5"/>
<StackPanel Grid.Column="2">
<Label Content="Body"/>
</StackPanel>
</Grid>
</Window>
Viewbox
используйте размер аранжировки иChild.DesiredSize
, чтобы вычислить коэффициент масштабирования дочернего элемента. Поэтому установите подходящую фиксированную ширину и высоту наGrid
подViewbox
, все будет просто отлично. - person Alex.Wei   schedule 25.05.2018