在WPF中绘制自定义形状

时间:2014-07-10 08:19:50

标签: wpf drawing geometry shape

我正在使用WPF并创建了一个自定义形状。我读到我们可以简单地覆盖DefiningGeometry函数来绘制我们的形状..但它对我不起作用,我不明白。只有当我在OnRender()中执行它时它才适用于我。为什么呢?

这将有效:

    protected override Geometry DefiningGeometry
    {
        get { return Geometry.Empty; }
    }

    protected override void OnRender(DrawingContext drawingContext)        
    {
        FormattedText ft = new FormattedText
           (Text, new CultureInfo("ru-ru"),
           FlowDirection.LeftToRight,
           new Typeface(
              new FontFamily("Arial"),
              FontStyles.Normal,
              FontWeights.Regular,
              new FontStretch()),
           TextHeight,
           new SolidColorBrush(TextColor));

        drawingContext.DrawText
           (ft, new Point(X, Y));
    }

但这不起作用:

    protected override Geometry DefiningGeometry
    {
        get {
            FormattedText ft = new FormattedText
           (Text, new CultureInfo("ru-ru"),
           FlowDirection.LeftToRight,
           new Typeface(
              new FontFamily("Arial"),
              FontStyles.Normal,
              FontWeights.Regular,
              new FontStretch()),
           TextHeight,
           new SolidColorBrush(TextColor));

            GeometryGroup group = new GeometryGroup();
            group.Children.Add(ft.BuildGeometry(new Point(X,Y)));

            return group;
        }
    }

    protected override void OnRender(DrawingContext drawingContext)        
    {
        base.OnRender(drawingContext);
    }

1 个答案:

答案 0 :(得分:0)

第二个代码应该有效。您认为它不起作用只是因为StrokeFill是透明的。你必须将它们初始化为一些明确可见的画笔,如下所示:

//the constructor of your own shape
public MyShape(){
   Stroke = Brushes.Blue;
   Fill = Brushes.Red;
}

第一个代码可能是因为DrawText方法从FormattedText获取默认的ForegroundBrush信息来绘制文本,我认为默认画笔不应该是透明的。所以你可以看到绘制的文本。