Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 在WPF中绘制动态多边形_C#_Wpf_Drawing_Polygon_Shapes - Fatal编程技术网

C# 在WPF中绘制动态多边形

C# 在WPF中绘制动态多边形,c#,wpf,drawing,polygon,shapes,C#,Wpf,Drawing,Polygon,Shapes,我不确定这是否是询问此类概念信息建议的正确位置,因此,如果在堆栈溢出中询问与此无关或离题,我深表歉意 我想在WPF中开发一个应用程序,它能够使用常规控件的功能绘制多边形,它们可以通过添加、删除或移动顶点来改变形状,通过运行时、数据绑定或可能通过C代码直接操作来改变画笔(目前还不确定) 我试图实现的是一个绘制地图的应用程序,上面的形状是在地图上具有动态边界的实体(例如,政治边界)。多边形还必须是可单击的控件,并带有碰撞测试(不仅仅是边界框,而是完全按照地图上实体的形状)。我可以预计形状会非常详细,

我不确定这是否是询问此类概念信息建议的正确位置,因此,如果在堆栈溢出中询问与此无关或离题,我深表歉意

我想在WPF中开发一个应用程序,它能够使用常规控件的功能绘制多边形,它们可以通过添加、删除或移动顶点来改变形状,通过运行时、数据绑定或可能通过C代码直接操作来改变画笔(目前还不确定)

我试图实现的是一个绘制地图的应用程序,上面的形状是在地图上具有动态边界的实体(例如,政治边界)。多边形还必须是可单击的控件,并带有碰撞测试(不仅仅是边界框,而是完全按照地图上实体的形状)。我可以预计形状会非常详细,因为河流和山脉或其他自然物体的边界不仅仅是两个顶点的直线,所以它的性能应该是一个重要因素,因为一个多边形可能包含数百个顶点)

我的结论是,通过WPF可以实现这样一个应用程序。但我的不确定性在于实现地图绘制的最有效方式,也许我应该像SharpDX一样实现D3D托管,但我不想要它,它会使事情变得更加复杂和困难


我希望这个映射中的所有内容都能作为常规WPF控件使用,并具有数据绑定和样式化功能。几个月来,我与WPF一起开发了一些小测试项目,以学习基本知识及其主要概念。但现在我的主要兴趣是与WPF一起开发。我需要一些建议,因为绘制复杂和动态的形状对我来说还不是很清楚,所以我需要继续并开始开发它。

我会使用WPF,事实上我会说WPF非常适合这一点,尽管还有很多东西需要学习。WPF使用DirectX,所以我认为它的性能已经足够好了(只要您有硬件)

您需要熟悉:

但是,如果您还不熟悉依赖项属性,那么学习它们可能是一件令人头痛的事情,因此您可以不用使用它们创建自己的
UserControl
,而是在
窗口中使用
画布
,以编程方式或在XAML设计时构建内容

至于实际绘制形状;如果您提前知道形状的外观,您可以使用Blend之类的工具提前绘制它们(或者自己在XAML中绘制-您需要熟悉路径标记语法),然后您可以在运行时使用变换,例如
ScaleTransform
,对其进行变换,或者,如果您想在运行时构建它们,可以通过编程方式将点添加到
多边形

e、 g.来自()


我不同意“您需要熟悉路径标记语法”,因为这只有在您想在XAML中创建形状时才有必要。对我来说,这个问题听起来更像是根据MVVM在代码中创建形状。谢谢,更新了。我的答案是不可知论的。谢谢你的回答。我回来就这个话题问一些更重要的问题。1) 你能检测出某个点(x,y)是否在多边形内部吗?2) 我是否需要管理draw调用并避免视图端口之外的调用以提高性能?3) 这是由WPF管理的渲染,还是在更改形状时我必须刷新和重画?1)我认为您必须手动执行此操作,即保存命令并循环检查,但如果点是鼠标,则始终可以使用事件,例如鼠标指针:。2和3)不,一点也不,WPF绘制所有内容,并知道视图中的内容以及是否有东西移动。伙计们,几何类中有一个方法。无需手动检查任何内容。如果查看一个已作为开源提供的映射控件,您可能会知道从何处开始。例如在CodePlex上。
//Add the Polygon Element
myPolygon = new Polygon();
myPolygon.Stroke = System.Windows.Media.Brushes.Black;
myPolygon.Fill = System.Windows.Media.Brushes.LightSeaGreen;
myPolygon.StrokeThickness = 2;
myPolygon.HorizontalAlignment = HorizontalAlignment.Left;
myPolygon.VerticalAlignment = VerticalAlignment.Center;
System.Windows.Point Point1 = new System.Windows.Point(1, 50);
System.Windows.Point Point2 = new System.Windows.Point(10,80);
System.Windows.Point Point3 = new System.Windows.Point(50,50);
PointCollection myPointCollection = new PointCollection();
myPointCollection.Add(Point1);
myPointCollection.Add(Point2);
myPointCollection.Add(Point3);
myPolygon.Points = myPointCollection;
myGrid.Children.Add(myPolygon);