问题标签 [drawingvisual]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
140 浏览

c# - 是基于 ObservableCollection 实现 DrawingVisual 的 MVVM WPF 方式吗

我的应用程序在画布上显示了许多线条和多边形/路径。我的 ViewModel 包含一系列ObservableCollections代表要绘制的不同项目。

我遇到的问题是应用程序的缩放和平移速度非常慢。缩放和平移都使用IvalueConverter和从世界坐标系转换到画布坐标系来处理。

为此,我必须对NotifyPropertyChange屏幕上可见的所有对象强制使用最新的平移和缩放值重新绘制它们。它适用于几百行,但对于数千行它非常慢。而且,如果您缩小以使所有对象都可见,因此受到NotifyPropertyChange超过 10,000 行的影响几乎无法使用。

我没有以任何方式使用多边形内置功能,因为所有处理、选择移动等都在视图模型中处理。因此,我想尝试使用,DrawingVisual而不是Shapes据我了解它们的开销要低得多,但我找不到任何好的 MVVM 示例来说明如何使用它们。我看到的示例表明它们是在代码隐藏中构建的,这不是我认为我应该使用它们的方式。

示例如下:

除非有 WPF 方法可以使用绑定到我的 observable 集合,否则DrawingVisual我需要在我的模型中创建和删除绘图对象。每次更新模型时,它都必须更新我的drawingVisual. 但后来我在模型中创建视图项目,这不是正确的方法。谁能建议我应该如何实施 DrawingVisual而不是Shapes在我的 MVVM 应用程序中?

这是我当前使用的代码的摘录Shapes

XAML

我的可观察集合在我的ViewModel

编辑

带有放大和缩小视图的画布屏幕截图:

缩小:

在此处输入图像描述

图像已经缩放了一点,但实际上,当您放大和缩小时,线条粗细、节点大小和箭头保持不变。只有节点的投影坐标发生变化。

放大:

在此处输入图像描述

0 投票
0 回答
56 浏览

c# - 如何使 C# 中的 DrawingVisual 对象具有唯一的笔刷颜色,但具有相同的粗细

我正在构建一个可以加载矢量文件并将它们显示在画布上的应用程序。为了有效地缩放和平移,我DrawingVisual为我的背景地图使用了不经常变化的形状。

为了使线条粗细保持不变,无论缩放如何,我都会在Pen.Thickness每个缩放事件中修改 。

这工作正常,但现在我正在尝试为Pen我遇到问题分配颜色。因为所有对象由于厚度/缩放原因共享相同Pen,所以我不知道如何为不同的对象分配不同的颜色。通过共享相同Pen,每个对象都被迫具有相同的颜色。

如何确保所有形状在缩放事件后接收厚度更新,但每个对象具有唯一的颜色?如果我需要Pen为每种颜色使用不同的笔,则无法知道我需要多少支笔。

我的代码如下:

这是我产生折线的方法:

每次缩放时都会触发此方法

这是一种根据它所属的文件、图层、项目本身和任何覆盖用户的选择来分配颜色的方法。