我正在尝试创建一个自定义转换器,它采用字符串名称,然后返回为该类名指定的路径。把它想象成每个类名的标志。它似乎什么也没做。我不知道为什么。这是我的密码。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
。