我在哪里可以找到有关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的画笔同时具有惊人的强大功能,并且令人惊讶地受到限制.它们显然是针对某些概念模型设计的,但我完全不确定它是否超出了一些非常微不足道的视觉效果,并且像往常一样,它被制作得更加复杂,奇怪的(记录不完整的)参数使得它非常简单,有点复杂.
您无法通过从该类继承来创建自定义 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 的评论。