我尝试创建一个自定义转换器,它接受一个字符串名称,然后返回为该类名指定的路径。将其视为每个类名的徽标。它似乎没有做任何事情。我不知道为什么。这是我的代码。 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());
}
}
}
答案 0 :(得分:1)
由于Data
是Geometry对象而不是字符串,因此您可能希望使用Geometry.Parse
返回Geometry对象。您可能希望将它们缓存在静态字段中,而不是每次都进行解析。此外,“ClassName”将被解释为绑定的Path,而不是转换器中的值,所以我想你希望它是ConverterParameter
。然后是转换中的parameter
参数:
<Path Data="{Binding ConverterParameter=ClassName, Converter={local:ClassToPathConverter}}"
Fill="Red" Width="16" Height="16" Stretch="Uniform"/>
然而,对于这种情况,绑定似乎有点奇怪,标记扩展可能会感觉更自然。但是,您拥有的不是实现标记扩展的方法。这个blog post有一个非常基本的例子。 ProvideValue方法需要返回Geometry
。