【问题标题】:How to Clone animated Brush?如何克隆动画画笔?
【发布时间】:2012-05-20 22:38:12
【问题描述】:

我有一个动画Brush 对象,我想Clone 这个画笔。

ColorAnimation ani = new ColorAnimation(Colors.White, TimeSpan.FromSeconds(1))
{ RepeatBehavior = RepeatBehavior.Forever, AutoReverse = true };

SolidColorBrush brush1 = new SolidColorBrush(Colors.Black);
brush1.BeginAnimation(SolidColorBrush.ColorProperty, ani);

SolidColorBrush brush2 = brush1.Clone();

// brush2 is not an animated Brush

if (!brush2.HasAnimatedProperties)
    MessageBox.Show("I don't want this!");

正如 MSDN 库所说(Brush.Clone 方法):

创建此 Brush 的可修改克隆,制作此对象值的深层副本。复制依赖属性时,此方法复制资源引用和数据绑定(但它们可能不再解析),但不复制动画或其当前值。

那么,克隆我的动画画笔的最佳方法是什么? 谢谢。

【问题讨论】:

    标签: .net wpf animation clone brush


    【解决方案1】:

    您需要在克隆上重新创建动画。没有其他办法。

    【讨论】:

      【解决方案2】:

      一种可靠的方法是扩展Brush 类并在您的派生类中实现ICloneable

      然后,您的自定义 Clone 方法可以处理您需要克隆的任何内容的克隆。

      【讨论】:

      • 你能给我举个例子来说明我的自定义克隆方法是如何实现的吗?
      • 嗯,ICloneable 是一个相当简单的界面。它公开了一个克隆方法,因此当您实现它时,您只需放置从源对象获取属性/字段并创建它们的副本的代码,然后返回一个带有复制内容的新对象。实现细节真的取决于你需要做什么以及你想怎么做。
      • @usr 您不能将 SolidColorBrush 扩展为密封,但您绝对可以扩展 Brush。检查得更好。
      • 是的。你仍然不能用你的派生画笔做任何事情。它不起作用,因为 WPF 的本机部分不知道如何绘制它。出于这个原因,我认为他们会让 ctor 内部化。推导它没有任何意义。
      • 伙计,我不会为你做作业。我提供了一些理论和如何进行的想法。鉴于 SolidColorBrush 是密封的,您无法以任何方式更改它。因此,要么构建自己的画笔,要么手动从 SolidColorBrush 实例中获取你需要的东西,然后做你需要做的任何事情。