Привязка пользовательского фона кнопки / границы к пользовательскому свойству - PullRequest
2 голосов
/ 04 марта 2020

Я довольно новичок в WPF и. NET Framework.

Я создал пользовательский класс кнопок и добавил свойство зависимостей «Цвета», которое является другим классом, который я создал, который определяет цвет границ кнопок / граней при включении и отключении. В стиле этой кнопки я пытаюсь использовать относительную привязку источника для привязки членов свойства «Цвета» к различным свойствам кнопки (Border.Background, Border.BorderBru sh, et c.).

Вот мой класс кнопки:

public class FsnButton : Button
{
    static FsnButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(FsnButton), new FrameworkPropertyMetadata(typeof(FsnButton)));
    }

    public FsnButton()
    {
        Colors = FsnColors.GrayBtnColors;
    }

    public GuiTypes.ButtonColors Colors
    {
        get { return GetValue(ColorsProperty) as GuiTypes.ButtonColors; }
        set { SetValue(ColorsProperty, value); }
    }

    public static readonly DependencyProperty ColorsProperty =
        DependencyProperty.Register("Colors", typeof(GuiTypes.ButtonColors), typeof(FsnButton), null);
}

А вот и часть шаблона стиля

        <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:FsnButton">
                <Border Name="Face" CornerRadius="3" 
                        Background="{ Binding  RelativeSource={RelativeSource Self}, Path=Colors.Enabled.Face}" 
                        BorderThickness="1" 
                        BorderBrush="{ Binding RelativeSource={RelativeSource Self}, Path=Colors.Enabled.Border}">
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="{ Binding RelativeSource={RelativeSource Self}, Path=Colors.Enabled.Border}"></Setter>
                        <Setter Property="Button.Effect">
                            <Setter.Value>
                                <DropShadowEffect Color="DarkSlateGray" Direction="320" ShadowDepth="0" BlurRadius="5" Opacity="0.5"></DropShadowEffect>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="RenderTransform">
                            <Setter.Value>
                                <TranslateTransform X="3" Y="3" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>

Этот подход неудачен. Когда я создаю экземпляр моего класса кнопок, он вообще не рисуется. Я на правильном пути? Есть ли лучший способ сделать то, что я хочу?

1 Ответ

1 голос
/ 04 марта 2020

Ваши пути привязки не разрешаются. Вы должны использовать либо TemplateBinding, либо RelativeSoure TemplatedParent, когда вы находитесь внутри ControlTemplate и хотите привязать сам шаблонный элемент управления:

<ControlTemplate TargetType="local:FsnButton">

  <!-- TemplatedParent binding source -->
  <Border Name="Face"  
          Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Colors.Enabled.Face}"
          BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Colors.Enabled.Border}" />

  <!-- TemplateBinding -->
  <Border Name="Face"  
          Background="{TemplateBinding Colors.Enabled.Face}"
          BorderBrush="{TemplateBinding Colors.Enabled.Border}" />
</ControlTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...