WPF:如何创建复杂的用户控件? (比如GDI +)

时间:2010-12-18 05:20:27

标签: c# wpf

例如,假设我想创建一些复杂的东西。像可变焦/可平移的图形。比如谷歌地图,股票市场图表等等。

XAML和整个层次结构并不真正起作用。我想要做的更像是在GDI + / Winforms当天。在哪里我可以覆盖油漆 即,“protected override void OnPaint(PaintEventArgs e)”然后我会画出我想要的任何东西。我在哪里做双缓冲。就像画到缓冲区并将其眨眼到屏幕上一样。

但是我如何在WPF中解决这个问题?

3 个答案:

答案 0 :(得分:2)

WPF和GDI / GDI + / WinForms之间的根本区别在于WPF使用保留模式渲染(而不是直接渲染GDI)。简而言之,这意味着系统(实际上是硬件)正在为您处理双缓冲。而不是程序绘制到屏幕/缓冲区,而是声明性地提供矢量对象树并将所有渲染保留为WPF。

矢量对象具有不同级别的复杂性/抽象 - 您可能想要处理的最低级别的是Visuals。 David提到的Shapes(Ellipse,Rectangle等)已经是更高级别的对象,它们也可以处理用户交互,如命中测试等。

答案 1 :(得分:1)

您可以使用任何WPF形状,例如EllipseRectangle,然后使用Canvas类移动它们:

var rect = new Rectangle();
//...set width, height...
Canvas.SetTop(rect, 10);
Canvas.SetLeft(rect, 15);

This应该让你入门。请记住,使用数学函数可以实现缩放,拉伸内容,平移和旋转,但不要惊慌! WPF也对此有所了解:

var rotateTransform1 = new RotateTransform(45);
rect.RenderTransform = rotateTransform1;

答案 2 :(得分:0)

如果你确实真的想要它,你可以从UIElementFrameworkElement派生你的控件并覆盖OnRender,你将获得一个DrawingContext对象,该对象提供绘制形状,文本的方法,图像。

但是如果你想在WPF的哲学和精神中工作,可能99%的时候你不需要覆盖OnRender。 WPF提供了很多(我真的意味着很多)通过样式,模板开发新控件的方法,如果这两个不能完成这项工作,那么在WPF的控件层次结构中继承相应的控件。

正如gstercken之前指出的那样,WPF不是WinForms,你必须在WPF中思考才能做好工作。