Рекомендации WPF для окна ввода данных
Вопрос
В настоящее время я играю с WPF, и теперь мне интересно, каким будет макет типичного окна ввода данных (более 20 текстовых полей и прочее).
atm, я использую такой объект сетки (базовый образец)
<Grid Margin="2,2,2,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions >
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">Vorname:</Label>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=Surname, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
<Label Grid.Row="1" Grid.Column="0">Nachname:</Label>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=ChristianName, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="2" Grid.Column="0">Strasse (Wohnsitz):</Label>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=Street1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="3" Grid.Column="0">Ort (Wohnsitz):</Label>
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding Path=Town1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="4" Grid.Column="0">Postleitzahl (Wohnsitz):</Label>
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding Path=PostalCode1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="5" Grid.Column="0">Bundesland (Wohnsitz):</Label>
<TextBox Grid.Row="5" Grid.Column="1" Text="{Binding Path=State1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="6" Grid.Column="0">Land (Wohnsitz):</Label>
<TextBox Grid.Row="6" Grid.Column="1" Text="{Binding Path=Country1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Label Grid.Row="7" Grid.Column="0">Zusatz (Wohnsitz):</Label>
<TextBox Grid.Row="7" Grid.Column="1" Text="{Binding Path=AdditionalAdrInfo1, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</Grid>
в основном это удовлетворяет всем моим потребностям в макете, но что, если я захочу что-то изменить, например добавить новое текстовое поле в строке 3?
в настоящее время мне нужно изменить каждое свойство Grid.Row больше 3, но это не может быть предполагаемым способом WPF !?
как другие размещают сложные окна ввода данных?
Тиа
Решение
У Карла Шиффлетта также есть хороший подход к LOB-формам в WPF: http://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/
Другие советы
Лично я большой поклонник AutoGrid: http://www.codeplex.com/wpfcontrib/Wiki/View.aspx?title=AutoGrid&referringTitle=Home
Некоторые люди используют вложенные StackPanel
s, чтобы «решить» эту проблему, но, ИМХО, это просто создает еще одну проблему (раздувание кода).Я думаю, что лучший способ решить эту проблему — написать собственную панель, в которой дочерние элементы будут последовательно располагаться в столбцах.Я сделал это в предыдущем проекте, и это имеет ряд преимуществ:
- Более читабельный и краткий XAML
- Легче поддерживать XAML
- Более высокая производительность
Использование выглядело примерно так:
<local:FieldPanel>
<Label>Field 1:</Label>
<TextBox/>
<Label>Field 2:</Label>
<TextBox/>
<Label>Field 3:</Label>
<TextBox/>
</local:FieldPanel>
Вот еще один макет формы http://www.slideshare.net/ackava/ui-atoms-form-layout