我如何从Brush继承,所以我可以添加一个Name属性?

时间:2012-11-20 15:55:42

标签: c# wpf

例如:

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的问题。但是有其他方式(例如使用附加属性)来实现我想要的相同效果吗?

4 个答案:

答案 0 :(得分:3)

这意味着您需要实现从Brush及其祖先继承的所有抽象方法。在这种情况下,它是CreateInstanceCore()类的Freezable方法。

为什么需要一个名为画笔?您可以创建一个画笔并将其存储到您的视图/窗口/应用程序的ResourceDictionary(在给定键下,基本上是一个名称) - 也许您正在寻找此解决方案。

有关此内容的更多信息:http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight.aspx

答案 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代码的Horizo​​ntal-line Hatch为窗口的背景着色,如下所示:

<DrawingBrush c:HatchBrushes.HatchStyle="Horizontal"
   c:HatchBrushes.Background="Red" 
   c:HatchBrushes.Foreground="Yellow" 
   c:HatchBrushes.PenThickness="2"/>