【问题标题】:Setting Path.Data in code-behind在代码隐藏中设置 Path.Data
【发布时间】:2015-06-24 06:55:29
【问题描述】:

我有这个 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 填充有 move and draw commands 语法,它不能直接用作代码隐藏中的文本值(如上所示),就像它可以在 xaml 中一样 - 我发现 @ Silverlight 中的 987654322@,我在 Metro/Windows-Store 应用程序中尝试了相同的技术,但尽管它编译正确,但屏幕上没有 Path


tl;dr如何在代码隐藏中创建这个PathData 如图所示?

【问题讨论】:

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


    【解决方案1】:

    我不久前在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);
    

    【讨论】:

    • 仅供参考,链接已失效。
    【解决方案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;
    

    【讨论】:

      【解决方案3】:

      我找到了一种更简单的替代方法,可以在后面的代码中创建 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),
      };
      

      【讨论】:

        猜你喜欢
        • 2018-08-23
        • 2012-09-05
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        相关资源
        最近更新 更多