Есть ли лучший способ, чем сетка, выстроить элементы управления в WPF? - PullRequest
2 голосов
/ 01 марта 2010

Я использую сетку по определению соответствия, определенному в этом вопросе Сетка против Stackpanel . Однако при работе с сетками вы должны явно определить положение элементов управления внутри них. Это становится проблемой, когда необходимо изменить порядок элементов управления или добавить новый элемент управления в сетку. С помощью кода, приведенного в качестве примера, есть ли способ заставить строки и столбцы для текста и текстовых полей выстраиваться в линию, при этом их легко изменить или расширить позже?

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="7*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Text="Value One:"   Grid.Row="0" Grid.Column="0"/>
        <TextBox x:Name="TextBoxOne"   Grid.Row="0" Grid.Column="1"/>

    <TextBlock Text="Value Two:"   Grid.Row="1" Grid.Column="0"/>
        <TextBox x:Name="TextBoxTwo"   Grid.Row="1" Grid.Column="1"/>

    <TextBlock Text="Value Three:" Grid.Row="2" Grid.Column="0"/>
        <TextBox x:Name="TextBoxThree" Grid.Row="2" Grid.Column="1"/>
</Grid>

1 Ответ

5 голосов
/ 01 марта 2010

Я написал пользовательский элемент управления, который я использую, что делает это чрезвычайно простым, но прежде чем я его создал, я обычно использовал такой тип вещи:

<ControlTemplate x:Key="ColumnsTemplate" TargetType="HeaderedContentControl">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="3*" />
      <ColumnDefinition Width="7*" />
    </Grid.ColumnDefinitions>
    <ContentPresenter Grid.Column="0" ContentSource="Header" />
    <ContentPresenter Grid.Column="1" />
  </Grid>
</ControlTemplate>

<ItemsControl ... ItemTemplate="{StaticResource ColumnsTemplate}">
  <HeaderedContentControl Header="Value One:">
    <TextBox x:Name="TextBoxOne" />
  </HeaderedContentControl>
  <HeaderedContentControl Header="Value Two:">
    <TextBox x:Name="TextBoxTwo" />
  </HeaderedContentControl>
  ...
</ItemsControl>

Это позволяет легко добавлять / удалять элементы из ItemsControl или, что еще лучше, привязывать данные.

Если вы предпочитаете автоматическое изменение размера сетки, а не размер звезды (3 * и 7 *), вы можете использовать общую область определения размера, установив IsSharedSizeScope для ItemsControl и SharedSizeGroup для первого ColumnDefinition .

Другим вариантом является GridView, но мне труднее использовать для этой цели.

...