将路径转换为几何形状
本文关键字:几何形 转换 路径 | 更新日期: 2023-09-27 17:57:41
大家好,我试图总结并提出了基本问题和我的想法,但到目前为止还不起作用:S
基本上,我的问题是:用户将元素添加到一起,我想根据这些图创建一个新元素,这样就可以为用户定义的元素创建一个新的路径。假设我有一个正方形和一个三角形。用户将其组合到一个房子中。现在我想让房子成为用户的一个元素。为此,我需要元素的路径,我该如何创建它?
我的想法所使用的地物元素基于路径字符串。因此,我希望这些转换成一个几何元素,我可以稍后使用。我使用AndréMeneses在下面的答案中提供的代码,代码复制在这里:
public static Geometry PathMarkupToGeometry(ShieldGearViewModel shieldGearModelRec)
{
string pathMarkup = shieldGearModelRec.Gear.Path;
try
{
string xaml =
"<Path " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<Path.Data>" + pathMarkup + "</Path.Data></Path>";
var path = System.Windows.Markup.XamlReader.Load(xaml) as System.Windows.Shapes.Path;
// Detach the PathGeometry from the Path
if (path != null)
{
path.Height = shieldGearModelRec.Gear.Height;
path.Width = shieldGearModelRec.Gear.Width;
path.Fill = new SolidColorBrush(Colors.Green);
path.Stretch = Stretch.Fill;
Geometry geometry = path.Data;
//Test not working, exception is thrown
//Rect transRect = new Rect(shieldGearModelRec.Gear.x, shieldGearModelRec.Gear.y, shieldGearModelRec.Gear.Width, shieldGearModelRec.Gear.Height);
//geometry.Transform.TransformBounds(transRect);
path.Data = null;
return geometry;
}
return null;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
return null;
}
我这样做是为了让一个几何体遵循这个链接描述的例子。上面的问题是我无法访问新几何图元的x或y位置,那么我该如何指定这个位置呢?
对于这个职位,我认为这个链接可能是一个解决方案,只是还没有起作用?:)
完成后,我将其添加到基于before链接的几何组中,这样我就可以获得新元素的路径。但是几何群有0作为界。因此,为了实现这一点,我需要为各个几何元素定义x和y,然后这可能会解决geomtrygroup问题,或者我必须在下面看看:)这个问题已经存在太久了:|
下面的文本是老问题和想法
我有一个字符串,我想在后面的代码中转换为几何形状。所以我在Stackoverflow WPF C#路径上发现了这一点:如何从带有路径数据的字符串中获取代码中的几何体(而不是XAML)
这个链接表明,可以使用以下代码解析将字符串转换为路径:
var path = new Path();
path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 400,175 H 280");
但是,解析在Windows Phone上不可用。我的其他努力并没有解决这个问题。我尝试了pathGeometry,但似乎不可能将字符串设置为路径?
所以我的问题是如何在代码背后将字符串转换为几何形状,而不绑定到视图中的元素。
第一步因此,我成功地用以下创建了一条路径
var pathTesting = new System.Windows.Shapes.Path();
var b = new System.Windows.Data.Binding
{
Source = DecorationOnShield[i].Gear.Path
};
System.Windows.Data.BindingOperations.SetBinding(pathTesting, System.Windows.Shapes.Path.DataProperty, b);
现在我正在尝试将路径转换为几何图形。
额外
我的想法是按照这个链接所描述的做同样的事情。示例显示:
var blackRectGeometry = new RectangleGeometry();
Rect rct = new Rect();
rct.X = 80;
rct.Y = 167;
rct.Width = 150;
rct.Height = 30;
blackRectGeometry.Rect = rct;
但是,我不想使用矩形,而是希望使用path形式的任意形状,但仍然可以设置坐标和大小等信息。
额外
我想定义一个用户控件,它由一条看起来像这样的路径组成:
<UserControl x:Class="UndoRedoShield.View.Geometry"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"
mc:Ignorable="d"
Canvas.Left="{Binding Gear.x}" Canvas.Top="{Binding Gear.y}">
<Path Data="{Binding Gear.Path}" Fill="{Binding Gear.Color}" Stretch="Fill" UseLayoutRounding="False" Height="{Binding Gear.Height}" Width="{Binding Gear.Width}" Opacity="{Binding Gear.Opacity}">
<Path.RenderTransform>
<ScaleTransform ScaleX="{Binding Gear.Scale}" ScaleY="{Binding Gear.Scale}"/>
</Path.RenderTransform>
</Path>
</UserControl>
但在几何方面还不能以任何方式使用它。有人知道用这种方法吗?欢迎使用任何方法!:)
额外:)
是否可以用UI元素创建一个几何形状,以便将渲染的用户控件转换为几何路径?
进度
我找到了这个链接,在那里我可以从路径创建几何体。路径具有属性宽度和高度。
但我在几何或路径中没有的属性如下:
- 画布。左侧
- 画布.顶部
- Canvas.ZIndex(我认为当我将其添加到GeometryGroup时,这是可能的)
这似乎可以通过Path.Data的bound属性来完成。但不能通过ZIndex。因此,这仍然需要使用geometryGroup进行测试,并且需要将Geometry添加到geometryGroup中。
一段时间前,在寻找解决方案时,我最终创建了这个函数。也许它会对你有所帮助。
public static Geometry PathMarkupToGeometry(string pathMarkup)
{
try
{
string xaml =
"<Path " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<Path.Data>" + pathMarkup + "</Path.Data></Path>";
var path = XamlReader.Load(xaml) as Path;
// Detach the PathGeometry from the Path
if (path != null)
{
Geometry geometry = path.Data;
path.Data = null;
return geometry;
}
return null;
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
return null;
}
然后我这样调用这个函数:
var arrow = new Path
{
Data = DesignHelpers.PathMarkupToGeometry("M-1,0 L0,1 L1,0"),
Fill = new SolidColorBrush(Colors.Black),
Stretch = Stretch.Fill,
Height = 12,
Width = 18,
HorizontalAlignment = HorizontalAlignment.Center
};
我不知道这是否完全符合你的需求,但也许它会有所帮助。
Geometry.Parse(据我所知,它是后端StreamGeometry)确实在Windows Phone平台上缺失,但根据此页面:http://msdn.microsoft.com/en-us/library/ms752293(v=vs.110).aspx
WPF提供了两个类,它们提供了用于描述几何路径:StreamGeometry和PathFigureCollection。
PathFigureCollection可用于Windows Phone,因此这里看起来像是检查的地方:
http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.media.pathfigure(v=vs.105).aspx
现在,您只需要能够从XAML样式标记创建PathGeometry。这里似乎有一些从XAML语法生成Path的示例:
将XAML PathGeometry转换为WPF PathGeometry
WindowsPhone7:如何像XAML中那样解析贝塞尔路径字符串?
基本上类似
string data = "M 100,200 C 100,25 400,350 400,175 H 280";
Path path = XamlReader.Load("<Path Data='" + data + "'/>") as Path;