如何在WPF中实现自定义画笔?

Moj*_*ter 14 .net wpf brush

我在哪里可以找到有关Brushes如何实现我自己的System.Windows.Media.Brush的足够信息?我可以处理所有可冻结的行李,但是为了让它起作用,我需要覆盖的并不是很明显.


是的,所以我并不是说我想使用预定义的画笔.我想扩展System.Windows.Media.Brush,这是一个抽象类.这完全是为了我自己的启发.我甚至不确定我能用什么样的刷子.我只是想了解刷子是如何工作的.如:

public AwesomeBrush : Brush
{

    protected override Freezable CreateInstanceCore()
    {
        return new AwesomeBrush();
    }

    ... // concrete brush stuff

}
Run Code Online (Sandbox Code Playgroud)

Mik*_*nen 10

我使用Reflector快速查看了现有的画笔.看起来他们的实现非常封闭,取决于很多internal管道.虽然可能有可能实现自己的画笔,但似乎它不是受支持的选项.它甚至可能是WPF控件与现有画笔紧密相关,并且不适用于自定义画笔.

最有可能实现类似自定义画笔的最佳方法是使用DrawingBrush和一些复杂的绘图逻辑.您可以使用其他画笔从复杂形状中构图画笔,这样可以让您达到所需的目标.

编辑后更新

由于这是用于教育,您可能最好下载Reflector并使用它来查看画笔的工作原理.它们并不意味着是自我实现的,因为它们依赖于internal程序员通常无法访问的某些类,所以很难这样做.

虽然令人感兴趣的是,Brush文档确实有一个注释,让继承者以正确的方式从Brush继承.

更多更新

在我四处寻找时,我发现了一种在中国博客上实现类似功能的相当简洁的方法.诀窍是使用标记扩展,所以它看起来像一个刷子.实际上,它会根据其属性创建一个新的图像画笔.似乎他得出了相同的结论,即有一些内部类阻止了简单的实现.


小智 5

要回答为什么您可能想要自定义画笔的问题,请考虑复杂的几何体,并且您希望使用与形状匹配的渐变填充它,同时从形状的中心(或任意任意起点)径向更改颜色.

静态填充无法实现这一点(几乎消除了所有现有的画笔).如果不能一遍又一遍地复制对象并将它们嵌套(并进行脱壳以使其全部看起来正确),用不同的颜色填充每一个,唯一可行的方法是使用可以查看被填充物体的刷子.

这在Forms中实际上是可行的.

但看起来没有任何办法在WPF中做到这一点,这是不幸的.

实际上,WPF的画笔同时具有惊人的强大功能,并且令人惊讶地受到限制.它们显然是针对某些概念模型设计的,但我完全不确定它是否超出了一些非常微不足道的视觉效果,并且像往常一样,它被制作得更加复杂,奇怪的(记录不完整的)参数使得它非常简单,有点复杂.


CSh*_*per 3

您无法通过从该类继承来创建自定义 WPF 画笔System.Windows.Media.Brush,因为该类包含内部抽象成员。

如果使用Reflector查看类的源码System.Windows.Media.Brush,会看到以下内部抽象方法:

internal abstract DUCE.ResourceHandle AddRefOnChannelCore(DUCE.Channel channel);
internal abstract DUCE.Channel GetChannelCore(int index);
internal abstract int GetChannelCountCore();
internal abstract DUCE.ResourceHandle GetHandleCore(DUCE.Channel channel);
internal abstract void ReleaseOnChannelCore(DUCE.Channel channel);
Run Code Online (Sandbox Code Playgroud)

这些必须被覆盖,但不能覆盖,因为它们是内部的。

注意:编辑我的答案,因为之前的答案System.Drawing.Brush与这个问题无关。特别感谢 Mikko Rantanen 的评论。

  • 您可以从 Brush 类继承 - 正如您所说,它是抽象类,并且抽象类必须被继承。 (4认同)
  • @M。Jahedbozorgan:您在这里所说的 System.Drawing.Brush 类是正确的...WPF 版本可以从中派生。请参阅系统.Windows.Media.Brush。 (3认同)
  • 构造函数不是内部的。受保护的画笔();/声明类型:System.Windows.Media.Brush /程序集:PresentationCore,Version=3.0.0.0 - 但是您已经接近问题了。画笔确实有内部抽象方法,只是没有构造函数。最糟糕的情况之一是“内部抽象 DUCE.ResourceHandle AddRefOnChannelCore(DUCE.Channel channel);”,其中参数也是内部类型。这些必须被覆盖,但不能覆盖,因为它们是内部的。 (2认同)