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)
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.
然后你会意识到绘制的椭圆大于窗口的客户区域.这是因为Width和Height属性的值包括Window边框.即使这样,使用Width和Height属性来获取WPF中UI元素的实际宽度和高度也不是正确的方法,因为double.NaN除非显式设置这些属性,否则它们将返回(除了在Window类中).
相反,您通常会使用ActualWidth和ActualHeight属性,就像在此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)
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |