符合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" />
我希望窗口附加StartColor
和EndColor
属性自动作为其自身附加ColorAnimation
值的开始和结束值的来源,而不必在XAML中指定将新ColorAnimation
分配给ColorAnimation
属性并设置绑定。
我知道我可以写几个DependencyPropertyChangedEventHandler
方法,在属性发生变化时为动画分配新值,但这对我来说有点笨拙和尴尬,我希望有一种不同的方式这样做。
为了澄清我的目的,我想要的是只有ColorAnimation
的{{1}}可用于FrameworkElement
将使用FrameworkElement
附加StartColor
的实例。其自身EndColor
和From
值的{}属性值和To
属性值。所以,我不希望每个控件都必须定义自己的附加ColorAnimation
,而是让默认使用它的每个控件都拥有自己的ColorAnimation
,并且只有那个ColorAnimation
1}}。