2

我有这个XAML代码,它使Path位于Canvas的内部,它位于MainPage.xaml页面中。在代码隐藏中设置Path.Data

<Path x:Name="progressPath" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stroke="Gold" StrokeThickness="5" 
     Canvas.Left="300" Canvas.Top="300" Height="305" Width="305" 
     Data="m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0"> 
    </Path> 

我想有几个Path的像这样的(例如,一个新的Path由当用户点击一个按钮),所以我决定在后台代码来创建它们 - 这没有按'似乎是可能的。

PathData填充了move and draw commands语法不能直接在被用作一个文本值(如上所示)代码隐藏状也可以是在XAML - 我发现workarounds for this Silverlight中,我试图在我的Metro/Windows-Store应用程序中使用相同的技术,但是它编译正确,屏幕上没有Path


TL;博士如何创建这个Path代码隐藏与Data是如图所示?

回答

3

我前段时间在winrt中也有过这个问题。看起来你不能直接在代码背后赋予“路径”值。

但是有一个解决方案here

我用这个类在WinRT中没有任何问题。我所要做的就是更改Convert和ConvertBack方法的签名,以实现IValueConverter接口,因为它在winrt中而不是在silverlight中。 在这里,他们是

public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     string path = value as string; 
     if (null != path) 
      return Convert(path); 
     else 
      return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     PathGeometry geometry = value as PathGeometry; 

     if (null != geometry) 
      return ConvertBack(geometry); 
     else 
      return default(string); 
    } 

用法:(或多或少)

var stringToPathGeometryConverter = new StringToPathGeometryConverter(); 
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0" ; 
progressPath.Data = stringToPathGeometryConverter.Convert(pathData); 
+0

完美地工作! –

2

另一种方法是使用XamlReader这与加载apropriate字符串。在C#6.0中它看起来像这样:

Path pathFromCode = XamlReader.Load($"<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'><Path.Data>{stringPathData}</Path.Data></Path>") as Path;