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



例如:

public class DesignerPatternBrush : Brush
{
    public string Name { get; set; }
}

我想通过添加一个名为 Name 的新属性来定义我自己的 Brush 类,但有一个编译器错误:

错误 CS0534: 'Brushes.DesignerPatternBrush' 不实现继承的抽象成员 'System.Windows.Freezable.CreateInstanceCore()'

如何将Name属性添加到Brush类型?

请注意此相关问题:如何在 WPF 中实现自定义画笔?它回答了为什么不可能从字面上继承Brush的问题。但是有没有其他方法(例如使用附加属性)来实现我想要的相同效果?

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

为什么需要命名画笔?您可以创建一个画笔并将其存储到您的视图/窗口/应用程序的 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"/>

最新更新