如何使用网格或其他控件在WPF中布局表单以实现可维护性

Jas*_*yne 15 forms wpf grid layout

我有一个WPF表单,我想在其上列出一个标准表单.每个表单元素都有一个标签,然后是一个控件.很标准的东西.

如果我使用包装面板,它可能导致标签和控件分开,但我希望它们保持在一起.是否有一些WPF相当于<nobr/>

网格工作,并允许列跨越等,但我真的很讨厌你在每个控件上指定列和行.这使得将内容重新排序或插入列表非常不方便.

有没有办法让网格使用更多HTML样式的列/行,其中项目是他们所在行的子项,以便我可以轻松地重新排序?

是否有其他控件可以让我轻松布局表单?

Rob*_*ney 23

是否有一些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>
Run Code Online (Sandbox Code Playgroud)

此外,对于柱状布局,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>
Run Code Online (Sandbox Code Playgroud)

我有点讨厌XAML的冗长,特别是你必须重复列定义.虽然如果你正确地构建你的类并使用模板,它并不是那么糟糕.请注意,您不会在此方案中的任何位置跟踪行号,因此重新排序字段很简单.


Mic*_*own 6

您可能正在寻找的是堆栈面板.使用垂直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>
Run Code Online (Sandbox Code Playgroud)

现在,您可以添加,删除,编辑和重新排序您的内容,而无需担心列和行.

  • 可能是为了获得更好的语法,请将宽度放在StackPanel.Resources中。 (2认同)

Raf*_*eda 5

尝试使用UniformGrid控件。