试图在WPF窗口中绘制椭圆,但它不可见
我正在尝试创建我自己的图形用户控件,我有一个已经在处理win表单,我正在尝试将它转移到WPF世界 我开始学习如何画图,所以我首先尝试画一个黑色椭圆,填充整个窗口,只是为了学习坐标在WPF中的工作原理 这是代码,当我运行应用程序时,没有显示任何内容,你知道我遗漏了什么吗试图在WPF窗口中绘制椭圆,但它不可见,wpf,draw,drawingcontext,onrender,drawellipse,Wpf,Draw,Drawingcontext,Onrender,Drawellipse,我正在尝试创建我自己的图形用户控件,我有一个已经在处理win表单,我正在尝试将它转移到WPF世界 我开始学习如何画图,所以我首先尝试画一个黑色椭圆,填充整个窗口,只是为了学习坐标在WPF中的工作原理 这是代码,当我运行应用程序时,没有显示任何内容,你知道我遗漏了什么吗 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }
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);
}
}
这是我做的样本
public MainWindow()
{
InitializeComponent();
var canvas = new Canvas();
Content = canvas;
var element = new DrawingVisualElement();
canvas.Children.Add(element);
CompositionTarget.Rendering += (s, e) =>
{
using (var dc = element.visual.RenderOpen())
dc.DrawEllipse(Brushes.Black,
new Pen(Brushes.Blue, 3), // Border
new Point(120, 120), 20, 40);
};
Mouse.Capture(canvas);
MouseDown += (s, e) => Mouse.Capture((UIElement)s);
MouseMove += (s, e) => Title = e.GetPosition(canvas).ToString();
MouseUp += (s, e) => Mouse.Capture(null);
}
class DrawingVisualElement : FrameworkElement
{
public DrawingVisual visual;
public DrawingVisualElement() { visual = new DrawingVisual(); }
protected override int VisualChildrenCount { get { return 1; } }
protected override Visual GetVisualChild(int index) { return visual; }
}
WPF与WinForms非常不同。您没有像绘制事件处理程序这样的东西,需要不断地重新绘制无效区域 绘制填充WPF中整个窗口区域的椭圆的最简单方法是以下XAML:
<Window ...>
<Grid>
<Ellipse Stroke="Black" Fill="Black"/>
</Grid>
</Window>
谢谢sajeetharan,但是您能解释一下我的原始代码中缺少了什么吗?您应该将它添加到canvas-1中,以便在此处使用
CompositionTarget.Rendering
事件。这在这里绝对是不必要的,可能会把OP带到一个完全错误的方向。@Clemens甚至我都知道我们可以使用Ecclipse并绘制它,但我回答了他的问题!以一种非常非常令人困惑的方式!感谢您提供了完整详细的答案+1 Clemens,我遇到了相同的问题,即指定除透明
之外的背景色会模糊我绘制的任何内容。是否可以将背景色设置为其他颜色,而不阻止绘制的内容?谢谢。@Sabuncu您的意思是在主窗口中有一个重写的OnRender方法?简而言之,你不应该这么做。如果你真的需要重写OnRender,你不应该在窗口中这样做,而应该在自定义控件中这样做。当我在XAML中为我的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);
}
}