Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使C#中的绘图可视对象具有独特的画笔颜色,但具有相同的厚度_C#_Wpf_Pen_Drawingvisual - Fatal编程技术网

如何使C#中的绘图可视对象具有独特的画笔颜色,但具有相同的厚度

如何使C#中的绘图可视对象具有独特的画笔颜色,但具有相同的厚度,c#,wpf,pen,drawingvisual,C#,Wpf,Pen,Drawingvisual,我正在构建一个应用程序,可以加载矢量文件并在画布上显示它们。为了有效地缩放和平移,我正在使用DrawingVisualshapes作为我的背景贴图,它们不会经常改变 为了在不考虑缩放的情况下保持线条厚度不变,我在每个缩放事件中修改了Pen.thickness 这很好,但现在我正试图为笔指定颜色,我遇到了问题。由于厚度/缩放原因,所有对象共享相同的画笔,我不知道如何为不同的对象分配不同的颜色。 通过共享相同的笔每个对象都被强制为相同的颜色 如何确保所有形状在缩放事件后都接收到厚度更新,但每个对象都

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

为了在不考虑缩放的情况下保持线条厚度不变,我在每个缩放事件中修改了
Pen.thickness

这很好,但现在我正试图为
笔指定颜色,我遇到了问题。由于厚度/缩放原因,所有对象共享相同的
画笔
,我不知道如何为不同的对象分配不同的颜色。 通过共享相同的
每个对象都被强制为相同的颜色

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

我的代码如下:

Pen myPen=new Pen();
这是我生成多段线的方法:

private DrawingVisual CreatePolyline(点集合点,笔刷颜色)
{
DrawingVisual DrawingVisual=新建DrawingVisual();
DrawingContext DrawingContext=drawingVisual.RenderOpen();
myPen.Thickness=0.5/Coords.zoom;
画笔=颜色;
var geometry=新的StreamGeometry();
使用(StreamGeometryContext ctx=geometry.Open())
{
ctx.beginigure(点[0],假,假);
List_points=points.Skip(1.ToList();
ctx.PolyLineTo(_点,真,假);
}
geometry.Freeze();
drawingContext.DrawGeometry(null,myPen,geometry);
drawingContext.Close();
返回绘图可视化;
}
每次缩放时都会触发此方法

公共无效句柄(ZoomEvent ZoomEvent)
{
myPen.Thickness=0.5/zoomEvent.Zoom;
}
这是一种根据颜色所属的文件、图层、项目本身和任何替代用户选择来分配颜色的方法

private void updatevisualselection()
{
visualCollection.Clear();
foreach(背景地图中的地图参考。参考)
{
if(reference.IsVisible==true)
{
foreach(reference.Layers中的ReferenceLayer层)
{
如果(layer.IsVisible==true)
{
foreach(层中的SingleItem项。SingleItems)
{
系统、窗口、媒体、颜色;
if(reference.colorOveride==true)
{
颜色=参考颜色;
}
else if(item.colorByLayer==true | | layer.colorOveride==true)
{
颜色=图层颜色;
}
其他的
{
颜色=项目。颜色覆盖;
}
var画笔=新的SolidColorBrush(Color.FromArgb(255,Color.R,Color.G,Color.B));
添加(创建多段线(item.Points,笔刷));
}
}
}
}
}
}

“为了在不考虑缩放的情况下保持线的厚度不变,我在每次缩放事件中都修改笔的厚度”-这似乎是错误的方法。考虑将缩放转换应用到流几何的转换属性,而不是设置宿主组件的ReNelTror或LayoutTransform。问题是,我有数千个几何体流,因为每个多段线、直线或多边形等都位于我的
CreatePolyline()
方法生成的自己的几何体流中。因此,我假设需要对每个单独的对象进行转换。画布上的RenderTransformer和更新画笔只需要两个更改,我认为这两个更改对性能更有利。它们都将使用相同的转换对象,而且您甚至不需要“重画”,只需更改转换即可。如果您需要几支画笔,为什么不创建几支画笔呢?例如,您可以将它们存储在列表中。