在代码隐藏中设置Path.Data

时间:2015-06-24 06:55:29

标签: c# windows-runtime windows-store-apps microsoft-metro winrt-xaml

我有这个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),所以我决定在代码隐藏 - 似乎不可能。

Path的{​​{1}}填充了move and draw commands语法,不能直接用作代码隐藏中的文本值(如上所示),就像它可以在xaml中 - 我在Silverlight中找到了workarounds for this,我在Metro / Windows-Store应用程序中尝试了相同的技术但是虽然它正确编译但屏幕上没有Data

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

2 个答案:

答案 0 :(得分:3)

我刚才在冬天遇到过这个问题。看来你不能指定一条路径&#34;值直接在代码后面。

但是有一个解决方案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);

答案 1 :(得分:2)

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