Как уменьшить дублирование в стилях - управляйте шаблоном с помощью триггеров (xaml) - PullRequest
0 голосов
/ 09 марта 2019

Проблема в том, что мой файл стилей - мерзость по 10 тысяч строк из-за дублирования.

Например, у меня есть стиль ButtonScaleMinus, который уже основан на AllButtons, но я не могу разделить ControlTemplate таким же образом.Существует множество триггеров, которые привязаны к имени границы.

Единственная разница на самом деле заключается в содержимом <Border x:Name='ElementBorder'... Так что все то же самое, только небольшой фрагмент кода будет меняться.

<Style x:Key='ButtonScaleMinus'
       TargetType='Button'
       BasedOn='{StaticResource AllButtons}'>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name='ElementBorder'
                        CornerRadius="5"
                        BorderThickness="1"
                        Padding="0"
                        BorderBrush='{StaticResource border1}'
                        Background='{StaticResource MenuButtonGradient}'>
                    <Viewbox Margin='10'
                             x:Name='ViewBox'
                             VerticalAlignment="Center"
                             HorizontalAlignment="Center">
                        <Path Data='M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z'
                              Fill='White'
                              Stroke='White'
                              x:Name='faImage'/>
                    </Viewbox>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled"
                             Value="False">
                        <Setter Property="Opacity"
                                Value="0.2" />
                        <Setter Property="Foreground"
                                Value='LightGray' />
                    </Trigger>
                    <Trigger Property="IsMouseOver"
                             Value="True">
                        <Setter TargetName="ElementBorder"
                                Property="Background"
                                Value='{StaticResource DefaultButtonOverBackground}' />
                        <Setter Property="Cursor"
                                Value='Hand' />
                    </Trigger>
                    <Trigger Property="IsPressed"
                             Value="True">
                        <Setter TargetName="ElementBorder"
                                Property="Background"
                                Value='{StaticResource DefaultButtonPressedBackground}' />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ЕстьЕсть ли способ уменьшить код выше до чего-то вроде этого:

<Style x:Key='ButtonScaleMinus'
   TargetType='Button'
   BasedOn='{StaticResource AllButtons}'>
   [different Border content]
</Style>

1 Ответ

0 голосов
/ 09 марта 2019

Кажется, у вас нет содержимого этой кнопки, поэтому у вас есть шаблон для каждой иконки, которую вы будете использовать.

Это ошибка.

Вы можете упростить то, что у вас естьв любом случае, установите путь растяжения, и он заполнит свой контейнер, так что вы можете потерять окно просмотра.

По сути, вам нужны свойства вашего пути - геометрия (данные для пути), заливка, сток ивсе, что вы используете в других шаблонах.

Либо.

Создайте IconButton или что-то еще, наследуя Button и добавив свойства зависимостей для этих свойств.

Или

Класс, который присоединяет эти свойства зависимостей.

Переместите все ваши геометрии в словарь ресурсов и дайте им ключи.

Вот пример

<Geometry x:Key="FlowRight">
    M1.265625,12.9837493896484L95.625,50.7181243896484 1.265625,88.5462493896484 24.375,50.7181243896484 1.265625,12.9837493896484z
</Geometry>

Затем вы можете использоватьэто как StaticResource.

Вы можете иметь один шаблон IconButton.Определите стили, задайте геометрию и кисти, если у вас много (скажем) плюсовых кнопок значков.

или

Вы можете просто установить или связать эти свойства непосредственно на Button / IconButton, которая использует вашшаблон.

или

Сделайте оба.Установите одно или два свойства, чтобы переопределить их в общем стиле.

Возможно, это недостаточно гибко для того, что вы хотите сделать.

Вы можете использовать ContentControl и Styles / Templatesдля этого, чтобы определить содержимое в ваших шаблонах.

Вы можете добавить ContentPresenter к вашему шаблону, и все, что вы установили для содержимого своей кнопки, будет отображаться в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...