例如:
public class DesignerPatternBrush : Brush
{
public string Name { get; set; }
}
我想通过添加一个名为 Name
的新属性来定义我自己的 Brush
类,但有一个编译器错误:
错误 CS0534: 'Brushes.DesignerPatternBrush' 不实现继承的抽象成员 'System.Windows.Freezable.CreateInstanceCore()'
如何将Name
属性添加到Brush
类型?
请注意此相关问题:如何在 WPF 中实现自定义画笔?它回答了为什么不可能从字面上继承Brush
的问题。但是有没有其他方法(例如使用附加属性)来实现我想要的相同效果?
这意味着您需要实现从 Brush 及其祖先继承的所有抽象方法。在这种情况下,它是Freezable
类CreateInstanceCore()
方法。
为什么需要命名画笔?您可以创建一个画笔并将其存储到您的视图/窗口/应用程序的 ResourceDictionary 中(在给定键下,基本上是一个名称) - 也许您正在寻找此解决方案。
更多关于这里的信息: http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight.aspx
正如编译错误消息所说,Brush 是一个抽象类 ->你必须实现它的抽象成员
要让Visual Studio为您完成所有工作,有一个快捷方式。
选择画笔类,然后按 Alt + Shift + F10 -->输入抽象类会自动实现:
public class T : Brush
{
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
}
编辑:
Visual Studio 自动实现所有可见的方法,但 Brush 类将一些方法定义为内部抽象
即:
internal abstract int GetChannelCountCore();
由于 Brush 是在 PresentationCore 中定义的,我们将永远无法覆盖程序集之外的抽象方法...... -->不可能从类继承
当你继承一个抽象类时,你需要Override
一些成员。您会注意到 Brush
下有一个小下拉列表。如果您在光标位于Brush
上时按 CTRL
+ .
,它会要求您实现它,我在 CTRL
+ Space
后按 Enter
.当你实现它时,你会看到这个:
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
我有一个简单的解决方案:您可以创建一个更改 Brush 属性抛出附加属性的类,而不是继承。例如:我创建了一个名为"HatchBrushes"的类,它可以创建55个具有顺从填充样式的DrawingBrushes(类似于WinForms HatchBrush)。事实上,这部分代码属于另一个程序员)类定义了 4 个控制填充画笔外观的附加属性:填充样式、背景、前景和笔粗细。所有这些属性都注册了一个名为"OnHatchChanged"的 PropertyChangedCallBck 子,我可以在其中更改 DrawingBrush 的属性:
Shared Sub OnHatchChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim DBrush = TryCast(d, DrawingBrush)
If DBrush Is Nothing Then Return
Dim B = GetHatchBrush(GetHatchStyle(DBrush), GetBackground(DBrush), GetForeground(DBrush), GetPenThickness(DBrush))
DBrush.Drawing = B.Drawing.CloneCurrentValue
DBrush.Stretch = B.Stretch
DBrush.ViewportUnits = B.ViewportUnits
DBrush.Viewport = B.Viewport
DBrush.TileMode = B.TileMode
End Sub
请注意,"GetHatchBrush"是一个函数,用于创建具有所需HatchStyle的DrawingBrush。我不会在这里写,因为它太长了。
现在,我可以使用水平线填充与 simole xaml 代码着色窗口的背景,如下所示:
<DrawingBrush c:HatchBrushes.HatchStyle="Horizontal"
c:HatchBrushes.Background="Red"
c:HatchBrushes.Foreground="Yellow"
c:HatchBrushes.PenThickness="2"/>