我正在尝试创建自己的图形用户控件,我已经有一个已经在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);
}
}
答案 0 :(得分:6)
WPF与WinForms截然不同。你没有类似Paint事件处理程序的东西,你经常需要重新绘制无效区域。
在WPF中绘制填充整个窗口区域的椭圆的简单方法是XAML:
<Window ...>
<Grid>
<Ellipse Stroke="Black" Fill="Black"/>
</Grid>
</Window>
但当然还有很多其他方法可以达到相同的效果。
如果您需要做更复杂的事情,WPF提供了大量支持图形和多媒体的课程。我建议您开始阅读MSDN上的在线文档的Graphics部分。
回到你的具体问题,有几件事需要提及。
首先,如果您已将Window的Background
属性设置为Transparent
,并且已使用Black
以外的颜色绘制椭圆,则会看到OnRender覆盖的结果。< / p>
然后你会意识到绘制的椭圆大于窗口的客户区。这是因为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);
}
}
答案 1 :(得分:1)
这是我做的样本,
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; }
}