尝试在WPF窗口中绘制椭圆,但它不可见

Bis*_*hoy 2 wpf draw drawellipse drawingcontext onrender

我正在尝试创建自己的图形用户控件,我已经有一个已经在win表单上工作,我正在尝试将其移动到WPF世界中.

我开始学习如何绘图,所以我首先尝试绘制一个填充整个窗口的黑色椭圆,只是为了了解坐标在WPF中是如何工作的.

所以这里是代码,当我运行应用程序时,没有显示任何内容,任何想法我错过了什么?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

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

        drawingContext.DrawEllipse(Brushes.Black, new Pen(Brushes.Black, 1), new Point(Width / 2, Height / 2), Width / 2, Height / 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

Cle*_*ens 6

WPF与WinForms非常不同.您没有类似Paint事件处理程序的东西,您经常需要重新绘制无效区域.

在WPF中绘制填充整个窗口区域的椭圆的简单方法是XAML:

<Window ...>
    <Grid>
        <Ellipse Stroke="Black" Fill="Black"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

但当然还有很多其他方法可以达到相同的效果.

如果您需要做更复杂的事情,WPF提供了大量支持图形和多媒体的类.我建议开始阅读MSDN上的在线文档的图形部分.


回到你的具体问题,有几件事需要提及.

首先,如果您已将Window的Background属性设置为Transparent并且已使用除以外的颜色绘制椭圆,您将看到OnRender覆盖的结果Black.

然后你会意识到绘制的椭圆大于窗口的客户区域.这是因为WidthHeight属性的值包括Window边框.即使这样,使用WidthHeight属性来获取WPF中UI元素的实际宽度和高度也不是正确的方法,因为double.NaN除非显式设置这些属性,否则它们将返回(除了在Window类中).

相反,您通常会使用ActualWidthActualHeight属性,就像在此UserControl中一样(可能完全符合您的意图):

public partial class DrawingControl : UserControl
{
    public DrawingControl()
    {
        InitializeComponent();
    }

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

        drawingContext.DrawEllipse(Brushes.Black,
            new Pen(Brushes.Black, 1),
            new Point(ActualWidth / 2, ActualHeight / 2),
            ActualWidth / 2, ActualHeight / 2);
    }
}
Run Code Online (Sandbox Code Playgroud)