【问题标题】:Drawing non-static rectangle programmatically以编程方式绘制非静态矩形
【发布时间】:2015-04-24 05:33:51
【问题描述】:

我正在尝试在 WPF 中绘制一个非静态(可变宽度高度 x y)填充矩形。我有使用 Winforms 的经验,但我以前从未使用过 WPF。这就是我在 WinForm 中使用 GDI+ 绘图调用所做的事情。

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(_brush1, _rect1);
}

而且,每当我更改 _rect1 属性时,我都会致电 this.Invalidate()

我在这件事上看到的所有“教程”都只是在.xaml 文件中绘制静态的非填充矩形(或者他们没有提到节目的代码在哪里......)。

我知道 WPF 的绘画工作方式不同,我只是不明白如何。我找到了一个similar methodprotected override void OnRender(DrawingContext dc) 并尝试将其添加到我创建项目public partial class MainWindow : Window 时得到的默认类中,但屏幕上没有绘制任何内容。我担心的另一件事是,DrawingContext 类只有一个 DrawRectangle 类,而没有 FillRectangle

我怎样才能有效地画出这样的东西?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您不想在 WPF 中覆盖 OnRender。从技术上讲,当然可以,但是会带来很多问题,一般不推荐。

    我要做的是在窗口上有一个面板,最好是Canvas,然后创建一个Rectangle 对象,然后您可以从代码隐藏(或者更好的是,使用数据绑定)操作该对象。如果将它放在Canvas 中,则可以通过更改其WidthHeight 以及附加属性Canvas.LeftCanvas.Top 来操纵它的大小和位置。

    在不了解您的具体情况的情况下,很难提供更具体的建议。

    编辑:This 相关问题有一些很好的答案和示例。

    【讨论】:

    • 我将如何使用代码访问我的画布?以及如何填充矩形?
    • Rectangle 具有定义颜色的 FillStroke 等属性。链接的问题有很好的例子,但如果你是 WPF 的初学者,那么里面的很多东西可能会让你感到困惑。不幸的是,您尝试做的并不是 WPF 中最容易做的事情。
    【解决方案2】:

    这不是您应该使用 WPF 的方式。它还有另一种创建图形的理念。但是,如果您正在寻找一种类似于 Windows 窗体方式的方法,您可以使用:

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);
    
        Background = Brushes.Transparent;
        drawingContext.DrawRectangle(
           Brushes.BlueViolet, new Pen(Brushes.Chartreuse, 2), new Rect(10, 10, 1000, 1000));
    }
    

    如您所见,您必须将背景设置为透明。

    【讨论】:

    • 我在问题中提到我想高效地进行绘图
    • 效率低,速度快。如果您正在寻找一种对程序员有效的方法,您必须阅读 WPF 的基础知识:XAML、Shapes、Drawings、DrawingContext。它非常强大,但刚开始需要一些时间来理解它。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多