У меня есть форма WPF, я хочу разметить стандартную форму на нее. Каждый элемент формы будет иметь маркировку и затем управление. Довольно стандартный материал.
Если я использую панель переноса, она может заставить маркировку и управление быть разделенной, но я хочу, чтобы они остались вместе. Есть ли некоторый эквивалент WPF <nobr/>
?
Работы сетки, и позволяют, чтобы столбец охватил и т.д., однако я действительно действительно ненавижу это, Вы указываете столбец и строку на каждом управлении. Это делает это чрезвычайно неудобным, чтобы переупорядочить или вставить вещи в список.
Существует ли способ заставить сетку использовать больше столбца/строк стиля HTML, где объекты являются ребенком строки, они находятся в, так, чтобы я мог переупорядочить легко?
Есть ли некоторое другое управление, которое позволит мне расположение форма легко?
Есть ли WPF-эквивалент nobr?
Помните, что вы можете вкладывать панели:
<WrapPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<Label>Some field</Label>
<TextBox>Some value</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label>Another field</Label>
<TextBox>Another value</TextBox>
</StackPanel>
...
</WrapPanel>
Кроме того, для столбчатых макетов область общего размера Grid может координировать любое количество сеток, которые его используют:
<StackPanel Orientation="Vertical" Grid.IsSharedSizeScope="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Label"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Some field</Label>
<TextBox Grid.Column="1">Some value</TextBox>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Label"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Another field</Label>
<TextBox Grid.Column="1">Another value</TextBox>
</Grid>
</StackPanel>
Мне не нравится, насколько многословен XAML для этого, особенно то, что вам нужно повторять определения столбцов. Хотя, если правильно структурировать классы и использовать шаблоны, это не так уж и страшно. И обратите внимание, что вы нигде в этой схеме не отслеживаете номера строк, поэтому переупорядочить поля просто.
Возможно, вы ищете панель стека. Использование вертикальной панели StackPanel позволит вам последовательно расположить метку и элементы управления. Для каждой метки и элемента управления вам может понадобиться панель с горизонтальным стеком, подобная этой
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Label Width="150">Name</Label>
<TextBox Width="200" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Width="150">Date of Birth</Label>
<DatePicker Width="200" />
</StackPanel>
</StackPanel>
. Теперь вы можете добавлять, удалять, редактировать и переупорядочивать содержимое по своему усмотрению, не беспокоясь о столбцах и строках.
Ознакомьтесь с материалами Карла.
Простой и чистый xaml:
<pt:Form x:Name="formMain" Style="{DynamicResource standardForm}" Grid.Row="1">
<TextBox pt:FormItem.LabelContent="_First Name" />
<TextBox pt:FormItem.LabelContent="_Last Name" />
<TextBox pt:FormItem.LabelContent="_Phone" Width="150" HorizontalAlignment="Left" />
<CheckBox pt:FormItem.LabelContent="Is _Active" />
</pt:Form>
Если вы можете это согласовать, я рекомендую Expression Blend, если вы собираетесь много заниматься дизайном пользовательского интерфейса. Это позволяет упростить просмотр предметов. Вложение элементов управления в различные контейнеры - хороший способ сделать пользовательский интерфейс динамичным, но структурированным.
Обычно я использую панель сетки, чтобы разбить окно на функциональные области. Затем я буду использовать серию StackPanels (часто это вертикальная панель стека с горизонтальными StackPanel внутри нее, каждая с меткой и текстовым полем).
К сожалению, сетки работают только так, как вы заявили. Элементы в них определяют строку и / или столбец, в котором они находятся. Если вы использовали Blend, добавление столбцов или строк сетки будет иметь элементы управления, которые автоматически изменят спецификацию строки / столбца, чтобы они оставались в том положении, в котором они были размещены.
Надеюсь, это поможет.
Пробная версия Expression Blend в Microsoft.
ОБНОВЛЕНИЕ:
VS2012 имеет множество функций Expression Blend, встроенных в конструктор WPF. Большая часть необходимости в копии Blend больше не существует, поскольку разработчики имеют доступ ко многим классным инструментам из Blend.
В нашем продукте мы используем HeaderedContentControl для размещения форм в сетке.Шаблон элемента управления имеет метку и отступы / поля, чтобы содержимое элемента управления всегда располагалось соответствующим образом. В XAML мы просто добавляем их по столбцам.
Я бы опубликовал XAML, но сейчас настраиваю новый компьютер. : | Но насколько я помню, это выглядело бы примерно так:
<Style x:Key="hccFormStyle" Targettype="{x:Type HeaderedContentControl}>
... some setters for colors, margin, padding, etc...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Label Content={Binding Content} Target={Binding Tag}> <-- pass the control for the access key with the tag
<ContentPresenter>
</ControlTemplate>
...triggers if necessary - hover states, etc...
</style>
Затем в сетке вы определяете свои строки и столбцы и помещаете по одному в каждую ячейку или просто в каждую строку:
<HeaderedContentControl x:Name="username" Grid.Column=0 Content="User Name" Tag=textboxUserName>
<Textbox x:Name=textboxUserName>
</HeaderedContentControl>
Я мог бы отвечать Другой вопрос, но вот как мы выкладываем наши формы.
У меня была та же проблема, переупорядочивание элементов управления в макете на основе сетки - настоящая боль.
Итак, я написал настраиваемую панель, которая выполняет «макет формы» (группы из двух столбцов, все метки одинакового размера, все элементы управления одинакового размера, все выровнены и т. Д.), Она в моем блоге по адресу: http : //www.nbdtech.com/Blog/archive/2010/07/27/easy-form-layout-in-wpf-part-1-ndash-introduction-formpanel.aspx