Каков наилучший подход для применения стилей к огромному количеству предметов? - PullRequest
3 голосов
/ 04 декабря 2008

В моих 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". Есть несколько способов добиться этого:

  1. Установите свойства непосредственно на каждом элементе управления - ПЛОХО! Не допускает создания скинов или централизации стилей.
  2. Создайте стиль с помощью x: Key = "MyStyleName" и примените стиль к каждому элементу управления. Лучше ... Делает централизованные стили и скины более управляемыми, но все же требует тонны разметки и может стать громоздким.
  3. Создайте глобальный стиль (т.е. не указывайте ключ x: Key и установите TargetType = {x: Type TextBox / TextBlock} - ПЛОХО! Проблема в том, что он влияет на ВСЕ элементы управления в приложении, которые не Расширение переопределяет этот стиль. Это может быть плохо для таких вещей, как меню, сетки и другие элементы управления, которые используют текстовые блоки и текстовые поля.
  4. Создайте стиль, который нацелен на Grid и явно устанавливает значения свойств зависимости, как <Setter Property="Frameworkelement.Margin" Value="3,1" /> Неплохо ... он правильно применяет стиль к каждому элементу в своем контенте, но также применяет его непосредственно к самой Grid ... не совсем то, что я хочу.

Так какой подход вы выбираете и почему? Что работает лучше всего?

Ответы [ 4 ]

5 голосов
/ 04 декабря 2008

Вы можете поместить «глобальный» стиль в секцию Resources сетки, таким образом ограничивая его влияние. Чтобы повторно использовать «глобальные» стили в разных местах, поместите их в словарь ресурсов не по умолчанию и включите его как MergedDictionary:

в Styles.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="{x:Type ...}"> ... </Style>
</ResourceDictionary>

в форме:

<Grid>
   <Grid.ColumnDefinitions.../>
   <Grid.RowDefinitions.../>

    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <!-- other resources here -->

        </ResourceDictionary>
    </Grid.Resources>

    ...
</Grid>
0 голосов
/ 11 декабря 2008

Вот решение, которое я придумал, используя Attached Property:

Артикул контекста статьи

0 голосов
/ 04 декабря 2008

Проверьте это.

http://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/

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

0 голосов
/ 04 декабря 2008

Вы можете использовать # 4, но затем явно переопределить эти свойства в самой Grid.

...