在代码隐藏中设置 Path.Data

Setting Path.Data in code-behind

我有这个 XAML 代码,它使 Path 位于 MainPage.xaml 页面中的 Canvas 中。

<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 在 Silverlight 中填充了 move and draw commands syntax which cannot directly be used as a text value (as shown above) in code-behind like it can be in xaml - I've found workarounds for this,我在我的 Metro/Windows-Store 应用程序中尝试了相同的技术,但尽管它编译正确,但有屏幕上没有Path


tl;dr 如何在代码隐藏中创建此 Path 并显示 Data

我前阵子在winrt也遇到过这个问题。似乎您不能直接在代码后面分配 "path" 值。

不过还是有办法的here

我在winrt中用这个class没有任何问题。我所要做的就是更改 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);

另一种方法是为此使用 XamlReader 并加载适当的字符串。在 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;

我找到了一种更简单的替代方法来在代码隐藏中创建 Path

var converter = TypeDescriptor.GetConverter(typeof(Geometry));
string pathData = "m 150,0 A 150,0 0 0 0 150,0 A 150,150 0 0 0 150,0";
var path = new Path
{
    Data = (Geometry)converter.ConvertFrom(pathData),
};