Задать вопрос
@romaro

Почему не работает дата биндинг в шаблоне кастомного компонента?

Есть кастомный компонент со свойством BackgroundMouseOver. Цвет фона кнопки должен измениться на эту кисть при изменении стейта компонента.

class CustomButton : Button
    {
        readonly static Color _defaultBackgroundMouseOverColor = Color.FromRgb(255, 0, 255);

        static CustomButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));
        }

        #region BackgroundMouseOver

        public SolidColorBrush BackgroundMouseOver
        {
            get => (SolidColorBrush)GetValue(BackgroundMouseOverProperty);
            set => SetValue(BackgroundMouseOverProperty, value);
        }

        public static readonly DependencyProperty BackgroundMouseOverProperty = DependencyProperty.Register(
            nameof(BackgroundMouseOver),
            typeof(SolidColorBrush),
            typeof(CustomButton),
            new PropertyMetadata(new SolidColorBrush(_defaultBackgroundMouseOverColor))
          );

        #endregion
    }


Переопределил шаблон компонента и пробую анимировать это свойство:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:TestApp_VSM">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
            <SolidColorBrush x:Key="MouseOverBrush" Color="Brown"/>
            <Color x:Key="MouseOverColor">Brown</Color>
            <local:SolidColorBrushToColorConverter x:Key="solidColorBrushToColorConverter"/>
        </ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
    <Style TargetType="{x:Type local:CustomButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomButton}">
                    <Border x:Name="buttonBorderColor" Background="{TemplateBinding BackgroundNormal}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup Name="CommonStates">
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="{Binding BackgroundMouseOver.Color, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" Duration="0:0:0.1">
                                        </ColorAnimation>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="Pressed"/>
                                <VisualState x:Name="Disabled"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>


Ничего не происходит. Но если указать цвет явно, все работает:
<Storyboard>
    <ColorAnimation  Storyboard.TargetProperty="Background.Color" To="{StaticResource MouseOverColor}" Duration="0:0:0.1"/>
    </Storyboard>


Почему анимация не получает значение цвета из BackgroundMouseOver?
  • Вопрос задан
  • 41 просмотр
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы