7

例如:

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

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

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

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

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

4

4 回答 4

3

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

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

更多信息在这里:http: //blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-sumption-resource-dictionaries-in-wpf-and-silverlight.aspx

于 2012-11-20T16:05:10.070 回答
2

正如编译错误消息所说,Brush an abstract class --> 你必须实现它的抽象成员

为了让 Visual Studio 为您完成所有工作,存在一个快捷方式。

选择 Brush 类并按 Alt + Shift + F10 --> 输入自动实现的抽象类:

public class T : Brush
{

    protected override Freezable CreateInstanceCore()
    {
        throw new NotImplementedException();
    }
}

编辑:

但这不适用于 Brush 类。Visual Studio 自动实现所有可见的方法,但 Brush 类将一些方法定义为内部抽象

IE:

internal abstract int GetChannelCountCore();

由于 Brush 是在 PresentationCore 中定义的,我们将永远无法覆盖程序集之外的抽象方法... --> 无法从类继承

于 2012-11-20T16:03:44.550 回答
1

当你继承一个抽象类时,你有一些你需要的成员Override。您会注意到Brush. 如果您在光标位于时按CTRL+ ,它将要求您执行它,我在+之后按。当你实现它时,你会看到:.BrushEnterCTRLSpace

  protected override Freezable CreateInstanceCore()
  {
    throw new NotImplementedException();
  }
于 2012-11-20T16:04:45.563 回答
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-lines Hatch 为窗口的背景着色,如下所示:

<DrawingBrush c:HatchBrushes.HatchStyle="Horizontal"
   c:HatchBrushes.Background="Red" 
   c:HatchBrushes.Foreground="Yellow" 
   c:HatchBrushes.PenThickness="2"/>
于 2014-09-29T00:12:28.617 回答