WPF добавляет настраиваемый атрибут для стиля управления в ResourceDictionary - PullRequest
0 голосов
/ 26 мая 2020

Я делаю скин для WPF и храню все стили в ResourceDictionary. Я написал шаблон кнопки, который имеет много разных цветов, например: PrimaryHover, PrimaryActive et c. Если я хочу добавить новый стиль с другими цветами, мне нужно скопировать и вставить этот код и заменить цвета во всем коде. Чтобы этого не делать, я хочу создать настраиваемые свойства, которые будут содержать цвета и указывать их в триггерах. Я создал класс со свойствами, но он невидим внутри ResourceDictionary. Как это сделать?

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Background" Value="{StaticResource Primary}" />
    <Setter Property="Foreground" Value="{StaticResource White}" />
    <Setter Property="BorderBrush" Value="{StaticResource PrimaryBorder}"/>
    <Setter Property="BorderThickness" Value="0,1,0,0"/>
    <Setter Property="Padding" Value="5,0,5,0"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid SnapsToDevicePixels="True">
                    <Border x:Name="BkgBorder" CornerRadius="3" BorderThickness="{TemplateBinding BorderThickness}"
                            BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Opacity="1">
                    </Border>

                    <ContentPresenter Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"/>

                </Grid>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="Background" Value="{StaticResource PrimaryFocused}" TargetName="BkgBorder"/>
                        <Setter Property="BorderBrush" Value="{StaticResource PrimaryBorderFocused}" TargetName="BkgBorder"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsEnabled" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" Value="{StaticResource PrimaryHover}" TargetName="BkgBorder"/>
                        <Setter Property="BorderBrush" Value="{StaticResource PrimaryBorderHover}" TargetName="BkgBorder"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsPressed" Value="True"/>
                            <Condition Property="IsEnabled" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" Value="{StaticResource PrimaryActive}" TargetName="BkgBorder"/>
                        <Setter Property="BorderBrush" Value="{StaticResource PrimaryBorderActive}" TargetName="BkgBorder"/>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="{StaticResource White}"/>
                    </Trigger>

                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

и класс

class Buttons
{
    public static SolidColorBrush GetHoverColor(DependencyObject obj)
    {
        return (SolidColorBrush)obj.GetValue(HoverColorProperty);
    }

    public static void SetHoverColor(DependencyObject obj, SolidColorBrush value)
    {
        obj.SetValue(HoverColorProperty, value);
    }

    public static readonly DependencyProperty HoverColorProperty =
        DependencyProperty.RegisterAttached("HoverColor", typeof(SolidColorBrush), typeof(MainWindow), new PropertyMetadata(new SolidColorBrush(Colors.Green)));

}

1 Ответ

0 голосов
/ 26 мая 2020

Мне удалось скопировать ваш класс в тестовый проект в том виде, в каком он есть, и использовать его без проблем. Мой рабочий пример выглядит так:

<Window x:Class="CSharpTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CSharpTest">

    <Button local:Buttons.HoverColor="Yellow"/>

</Window>

В качестве отдельного примечания имейте в виду, что с учетом того, как ваше свойство в настоящее время объявлено, его можно применить к любому типу DependencyObject. Если вы хотите ограничить, чтобы он действовал только на Button s, тогда вы должны сделать это вместо:

    public static SolidColorBrush GetHoverColor(Button obj)
    {
        return (SolidColorBrush)obj.GetValue(HoverColorProperty);
    }

    public static void SetHoverColor(Button obj, SolidColorBrush value)
    {
        obj.SetValue(HoverColorProperty, value);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...