Почему WPF зарезает элементы?

216
24 апреля 2018, 00:43

Дизайнер все красиво показывает:

На выходи выглядит так:

Вроде, в XAML ничего криминаль

<Label Content="Выбор проекта" Margin="40,84,633,378"/>
    <ComboBox x:Name="projectBox"  Margin="220,84,398,378"  ItemsSource="{Binding Projects}" DisplayMemberPath="ProjectName" IsSynchronizedWithCurrentItem="True" />
Answer 1

У WPF всё устроено просто. Когда Grid пытается разместить ваши элементы, он из области, в которой должен быть расположен ваш элемент (если у вас нет ни ColumnDefinitions, ни RowDefinitions, то это весь Grid) вычитает слева 220 и справа 378, и в этой области пытается разместить элемент. Если оставшаяся область получается слишком маленькой, то элементу, понятно, даётся очень мало места, и он обрезается в отведённом месте. Вы можете легко увидеть это, потягав окно за правый нижний угол, чтобы оно меняло свои размеры.

Поведение у WinForms, судя по всему, не такое.

В WPF вам очень редко должно хотеться использовать Margin для размещения элементов. Он должен использоваться только по прямому назначению: задавать небольшой визуальный отступ от края положенной области. К сожалению, при использовании встроенного дизайнера Студии расположение элементов часто устанавливается при помощи именно Margin.

Правильный UI пишется на XAML'е вручную. (И если вы думаете, что вначале и через дизайнер покатит, то это не так, пишите вручную сразу.)

Для вашего случая может подойти что-то такое:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <DockPanel LastChildFill="True" Grid.Row="1" Margin="5">
        <Label Content="Выбор проекта" DockPanel.Dock="Left" MaxWidth="150"/>
        <ComboBox Margin="10,0,0,0" />
    </DockPanel>
</Grid>

Результат:

READ ALSO
Связь объектов с помощью Line Renderer

Связь объектов с помощью Line Renderer

Как с помощью Line Renderer связать два объекта в Unity3D, если такое возможно? Просто обычная визуальная связь, при которой, например, объекты могут...

165
Уничтожение объекта по клику

Уничтожение объекта по клику

Имеется несколько объектов на сцене, которые я хочу уничтожать по клику с помощью этой функции:

206
Проблема с синхронизацией TextBox-а и TreeView

Проблема с синхронизацией TextBox-а и TreeView

Класс для формирования Items в TreeView

163