【问题标题】:DrawingContext DrawGeometry on Canvas (wpf)画布上的 DrawingContext DrawGeometry (wpf)
【发布时间】:2016-10-03 17:52:26
【问题描述】:

我尝试在我的 WPF 项目中以编程方式绘制一个圆角矩形。我对 WPF 很陌生,并试图弄清楚绘图是如何工作的,因为它与 WinForms 有很大不同。我正在使用>this< 链接作为圆角矩形方法(我的方法与该网站上的方法相同)。这是我的代码:

Rect rect = new Rect();
rect.Width = Width - BorderSize;
rect.Height = Height - BorderSize;

DrawingVisual drawingVisual = new DrawingVisual();
using (var draw = drawingVisual.RenderOpen())
{
    DrawRoundedRectangle(draw, new SolidColorBrush(Color.FromRgb(0, 0, 0)),
    new Pen(new SolidColorBrush(Color.FromRgb(0, 0, 0)), BorderSize), rect, new CornerRadius(5, 5, 5, 5));
}

ContentPresenter content = new ContentPresenter();
content.Content = drawingVisual;
previewcanvas.Children.Add(content);

这是我在画布上的输出:

不是我所期待的;)一开始不应该有任何文字。

希望有人能帮我画圆角矩形!

编辑

一些额外的信息,我需要能够设置每个单独的角。

【问题讨论】:

  • 我认为您应该使用RenderTargetBitmap 渲染您的视觉效果,然后您应该将RenderTargetBitmap 分配给Image.Source。然后你应该将Image 添加到Canvas

标签: c# wpf canvas


【解决方案1】:
        Rect rect = new Rect();
        rect.Width = Width - BorderSize;
        rect.Height = Height - BorderSize;
        DrawingVisual drawingVisual = new DrawingVisual();
        using (var draw = drawingVisual.RenderOpen())
        {
            DrawRoundedRectangle(draw, new SolidColorBrush(Color.FromRgb(0, 0, 0)),
            new Pen(new SolidColorBrush(Color.FromRgb(0, 0, 0)), BorderSize), rect, new CornerRadius(5, 5, 5, 5));
        }
        RenderTargetBitmap rtb = new RenderTargetBitmap(rect.Width, rect.Height, 96, 96, PixelFormats.Default);
        rtb.Render(drawingVisual);
        Image image = new Image();
        image.Source = rtb;
        previewcanvas.Children.Add(image);

【讨论】:

  • 就像一个魅力,但我想知道这是否是在图像中绘制它然后在屏幕上绘制图像的“正确方法”,如果这有意义的话。
【解决方案2】:

使用 RadiusX 和 RadiusY:

  rect = new Rectangle
        {
            Stroke = Brushes.Red,
            StrokeThickness = 2,
            Width = 100,
            Height = 100,
            RadiusX = 25,
            RadiusY = 25
        };
        Canvas.SetLeft(rect, startPoint.X);
        Canvas.SetTop(rect, startPoint.X);
        canvas.Children.Add(rect);

Xaml:

  <Canvas x:Name="canvas"/>

【讨论】:

【解决方案3】:

经过搜索,我找到了一个更简单的解决方案:

Border border = new Border();

border.BorderThickness = new Thickness(2);
border.CornerRadius = new CornerRadius(5,15,25,35);
border.BorderBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#000"));
border.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#000"));
border.Width = 100;
border.Height = 100;
border.Margin = new Thickness(10);

previewcanvas.Children.Add(border);

这是一种作弊(因为它不是矩形),但它有效。这是我的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2017-05-18
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多