В моих LOB-приложениях я обычно получаю контейнеры, которые содержат множество различных текстовых блоков и текстовых полей для ввода данных пользователями. Обычно мне нужно применить определенное поле или вертикальное / горизонтальное выравнивание для каждого элемента управления.
Допустим, в моей форме есть Grid, который выглядит следующим образом (для краткости была исключена большая разметка):
<Grid>
<Grid.ColumnDefinitions.../>
<Grid.RowDefinitions.../>
<TextBlock Text="MyLabel" />
<TextBox Text={Binding ...}/>
.
'
<!-- Repated a bunch more times along with all of the Grid.Row, Grid.Column definitions -->
</Grid>
Теперь предположим, что мне нужно, чтобы каждый элемент, содержащийся в моей сетке, имел Margin = "3,1" VerticalContentAlignment = "Left" VerticalAlignment = "Center". Есть несколько способов добиться этого:
- Установите свойства непосредственно на каждом элементе управления - ПЛОХО! Не допускает создания скинов или централизации стилей.
- Создайте стиль с помощью x: Key = "MyStyleName" и примените стиль к каждому элементу управления. Лучше ... Делает централизованные стили и скины более управляемыми, но все же требует тонны разметки и может стать громоздким.
- Создайте глобальный стиль (т.е. не указывайте ключ x: Key и установите TargetType = {x: Type TextBox / TextBlock} - ПЛОХО! Проблема в том, что он влияет на ВСЕ элементы управления в приложении, которые не Расширение переопределяет этот стиль. Это может быть плохо для таких вещей, как меню, сетки и другие элементы управления, которые используют текстовые блоки и текстовые поля.
- Создайте стиль, который нацелен на Grid и явно устанавливает значения свойств зависимости, как
<Setter Property="Frameworkelement.Margin" Value="3,1" />
Неплохо ... он правильно применяет стиль к каждому элементу в своем контенте, но также применяет его непосредственно к самой Grid ... не совсем то, что я хочу.
Так какой подход вы выбираете и почему? Что работает лучше всего?