ohm*_*ama 6 c# wpf graphics equivalent
所以,我使用了winForms .CreateGraphics来绘制各种不同的东西,从线条到盒子再到图像.它非常活泼,反应灵敏.
我想在C#中学习WPF
我发现WPF允许我将"矩形"对象"添加"到画布上,以便正确显示它们.但是,我有时会画出数十万个矩形,并且绘制速度会变得非常慢,当我移动一个矩形时,UI变得不那么活泼.
在winForms中直接绘制到元素上并不是很快,但无论我绘制多少,它都是一致的.
在WPF中有这样的解决方案吗?
我尝试添加一个linq System.Drawing,它给了我一个Graphics对象,但我试过的wpf元素都没有这个.CreateGraphics()方法.
WPF 使用与 WinForms 不同的图形操作模型。
使用 WinForms,您可以直接编辑屏幕上的像素。绘制像素后,矩形的概念就丢失了。绘制像素是一个非常快的操作。
使用 WPF,您无需控制屏幕上的像素。DirectDraw 是。DirectDraw 是一个基于矢量的合成引擎。您不绘制像素。您可以定义矢量形状(或视觉效果)。形状或矩形的概念被保留,即使在图像渲染到屏幕之后也是如此。当您添加一个与其他矩形重叠的新矩形时,所有其他矩形都需要重新绘制。这可能是您的性能下降的地方。使用 WinForms 时不会发生这种情况。
您可以通过覆盖 OnRender 稍微提高 WPF 的性能。您可以削减 Rectangle 对象的开销并直接提供视觉效果。但是,您仍然没有在屏幕上绘制像素。您正在定义 DirectDraw 用于渲染图像的形状。在这方面,OnRender 名称可能有点误导。
我相信您可以找到很多技巧来提高 WPF 中应用程序的性能。有一些方法仍然可以绘制像素 - 但这有点违背了 WPF 的意义。
你在做什么需要数千个矩形?
您需要创建一个覆盖OnRender 的控件并在其中进行绘图。没有办法让您在另一个控件上绘图,但控件可以自行绘制。
另外,请记住,WPF 使用保留的图形,因此如果您更改某些内容,则需要根据需要使视觉效果无效。
编辑:
就像是:
public class MyControl : Control {
public MyControl() {
this.Rects = new ObservableCollection<Rect>();
// TODO: attach to CollectionChanged to know when to invalidate visual
}
public ObservableCollection<Rect> Rects { get; private set; }
protected override void OnRender(DrawingContext dc) {
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Colors.LimeGreen;
Pen myPen = new Pen(Brushes.Blue, 10);
foreach (Rect rect in this.Rects)
dc.DrawRectangle(mySolidColorBrush, myPen, rect);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8676 次 |
| 最近记录: |