wpf字符串转换路径



我正在尝试创建一个自定义转换器,它采用字符串名称,然后返回为该类名指定的路径。把它想象成每个类名的标志。它似乎什么也没做。我不知道为什么。这是我的密码。ClassName可以是Triangle、Camera。我认为问题出在(value.ToString().ToLower())它应该是一个字符串,但在控制台中的输出是这样的

转换器无法转换

用法

<Path Data="{Binding ClassName, Converter={local:ClassToPathConverter}}"
      Fill="Red" Width="16" Height="16" Stretch="Uniform"/>

转换器

using System;
using System.Windows.Data;
using System.Windows;
using System.Globalization;
using System.Windows.Markup;
namespace WpfApplication1
{
    internal class ClassToPathConverter : MarkupExtension, IValueConverter
    {
        private static ClassToPathConverter converter;
        public ClassToPathConverter() { }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {            
            switch (value.ToString().ToLower())
            {
                case "triangle":
                    return "M18,0C8.1,0,0,8.1,0,18c0,9.9,8.1,18,18,18s18 - 8.1,18 - 18 C36,8.1,27.9,0,18,0z M9,24.8l9 - 18l9,18H9z M21.4,21.4L18,13.5l - 3.4,7.9H21.4z";
                case "camera":
                    return "M18,36C8.1,36,0,27.9,0,18C0,8.1,8.1,0,18,0c9.9,0,18,8.1,18,18 C36,27.9,27.9,36,18,36z M28.1,12.4l - 5.6,4.5v - 3.4c0 - 0.6 - 0.5 - 1.1 - 1.1 - 1.1H10.1c - 0.6,0 - 1.1,0.5 - 1.1,1.1v9c0,0.6,0.5,1.1,1.1,1.1h11.3 c0.6,0,1.1 - 0.5,1.1 - 1.1v - 3.4l5.6,4.5V12.4z";
                default:
                    return "M 100,200 C 100,25 400,350 400,175 H 280";
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return converter ?? (converter = new ClassToPathConverter());
        }
    }
}

由于Data是一个Geometry对象,而不是字符串,因此您可能希望使用Geometry.Parse返回一个Geometric对象。您可能希望将它们缓存在静态字段中,而不是每次都进行解析。此外,"ClassName"将被解释为绑定的Path,而不是转换器中的值,所以我想您希望它是ConverterParameter。然后是Convert中的parameter参数:

<Path Data="{Binding ConverterParameter=ClassName, Converter={local:ClassToPathConverter}}"
  Fill="Red" Width="16" Height="16" Stretch="Uniform"/>

然而,绑定似乎有点奇怪。在这种情况下,标记扩展可能会感觉更自然。然而,您所拥有的并不是实现标记扩展的方法。这篇博客文章有一个非常基本的例子。ProviderValue方法将需要返回Geometry

最新更新