如何将附加属性绑定到代码中的附加属性?

时间:2018-04-11 23:22:59

标签: c# wpf xaml data-binding attached-properties

符合Minimal, Complete and Verifiable Example要求:

public class Attachable {
    protected static readonly DependencyProperty
        ColorAnimationProperty = DependencyProperty.RegisterAttached(
            "ColorAnimation", typeof( ColorAnimation ),
            typeof( Attachable ), new PropertyMetadata( new ColorAnimation ) );

    public static readonly DependencyProperty
        StartColorProperty = DependencyProperty.RegisterAttached(
            "StartColor", typeof( Color ), typeof( Attachable ),
            new PropertyMetadata( Colors.White ) ),
        EndColorProperty = DependencyProperty.RegisterAttached(
            "EndColor", typeof( Color ), typeof( Attachable ),
            new PropertyMetadata( Colors.Black ) );

    public static Color GetStartColor( FrameworkElement source ) =>
        ( Color )( source.GetValue( StartColorProperty ) );
    public static void SetStartColor( FrameworkElement target, object value ) =>
        target.SetValue( StartColorProperty, value );
    public static Color GetEndColor( FrameworkElement source ) =>
        ( Color )( source.GetValue( EndColorProperty ) );
    public static void SetEndColor( FrameworkElement target, object value ) =>
        target.SetValue( EndColorProperty, value );

    protected static ColorAnimation GetColorAnimation( FrameworkElement source ) =>
        source.GetValue( ColorAnimationProperty ) as ColorAnimation;
}

在XAML中使用:

<Window
    x:Class="MCVE.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:l="clr-namespace:MCVE"
    xmlns:lib="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"
    l:Attachable.StartColor="White" l:Attachable.EndColor="Black" />

我希望窗口附加StartColorEndColor属性自动作为其自身附加ColorAnimation值的开始和结束值的来源,而不必在XAML中指定将新ColorAnimation分配给ColorAnimation属性并设置绑定。

我知道我可以写几个DependencyPropertyChangedEventHandler方法,在属性发生变化时为动画分配新值,但这对我来说有点笨拙和尴尬,我希望有一种不同的方式这样做。

编辑1

为了澄清我的目的,我想要的是只有ColorAnimation的{​​{1}}可用于FrameworkElement将使用FrameworkElement附加StartColor的实例。其自身EndColorFrom值的{}属性值和To属性值。所以,我不希望每个控件都必须定义自己的附加ColorAnimation,而是让默认使用它的每个控件都拥有自己的ColorAnimation,并且只有那个ColorAnimation 1}}。

0 个答案:

没有答案