例如:
public class DesignerPatternBrush : Brush
{
public string Name { get; set; }
}
我想通过添加一个名为Brush
的新属性来定义我自己的Name
类,但是存在编译器错误:
错误CS0534:'Brushes.DesignerPatternBrush'没有实现继承的抽象成员'System.Windows.Freezable.CreateInstanceCore()'
如何将Name
属性添加到Brush
类型?
请注意以下相关问题:How do I implement a custom Brush in WPF?它回答了为什么无法真正继承Brush
的问题。但是有其他方式(例如使用附加属性)来实现我想要的相同效果吗?
答案 0 :(得分:3)
这意味着您需要实现从Brush及其祖先继承的所有抽象方法。在这种情况下,它是CreateInstanceCore()
类的Freezable
方法。
为什么需要一个名为画笔?您可以创建一个画笔并将其存储到您的视图/窗口/应用程序的ResourceDictionary(在给定键下,基本上是一个名称) - 也许您正在寻找此解决方案。
答案 1 :(得分:2)
正如编译错误消息所说是刷一个抽象类 - >你必须实现其抽象成员
让Visual Studio为您完成所有工作,存在一个快捷方式。
选择Brush类并按Alt + Shift + F10 - >输入 抽象类自动实现:
public class T : Brush
{
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
}
编辑:
但这不适用于Brush类。 Visual Studio自动实现所有可见的方法,但Brush类将一些方法定义为内部抽象
即:
internal abstract int GetChannelCountCore();
由于在PresentationCore中定义了Brush,我们永远无法覆盖程序集外的抽象方法... - >不可能从班级继承
答案 2 :(得分:1)
当您继承抽象类时,您需要Override
所需的一些成员。您会注意到Brush
下的一点下拉菜单。如果您在光标位于CTRL
时按.
+ Brush
,则会要求您实施该文件,我会在Enter
+ {{1}之后按CTRL
}。实现它时,您将看到:
Space
答案 3 :(得分:0)
我有一个简单的解决方案:您可以创建一个类来改变Brush属性抛出附加属性,而不是继承。例如: 我创建了一个名为“HatchBrushes”的类,可以使用不同的填充样式创建55个DrawingBrushes(类似于WinForms HatchBrush ..实际上这部分代码属于另一个程序员) HatchBrushes类定义了4个附加属性,用于控制填充画笔外观:HatchStyle,Background,Foreground和PenThickness。所有这些属性都注册一个名为“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代码的Horizontal-line Hatch为窗口的背景着色,如下所示:
<DrawingBrush c:HatchBrushes.HatchStyle="Horizontal"
c:HatchBrushes.Background="Red"
c:HatchBrushes.Foreground="Yellow"
c:HatchBrushes.PenThickness="2"/>