1

我试图根据某些条件允许多个图标大小。为此,我有一堆文件夹:'Images\Icons\...\*.png' 其中 ... 是大小(16、32、64、128、256 等)每个文件夹包含所有针对给定大小优化的图标。

我的问题我似乎无法在图像源路径中指定文件夹...即:

<Image x:Name  = "img" 
       Stretch = "None" 
       Source  = "{Binding StringFormat=Images\Icons\{0}\Multi.png, 
                   RelativeSource={RelativeSource Self}, 
                   Path=Parent.Parent.Tag}" />

现在,我只是将文件夹名称存储在祖父母的标签中(我将来会绑定到其他东西,但现在我只是想把这一部分拼凑在一起)。当我尝试构建上述 xaml 时,出现错误:

The text \Multi.png ... is not allowed after the closing } of a markup extension.

这让我怀疑它将 {0} 视为标记扩展,而不是我的字符串格式的一部分。我已经阅读了有关使用 {} 转义并使用单引号指定字符串格式的信息,但两者都不起作用:

Source  = "{Binding StringFormat={}Images\Icons\{0}\Multi.png, ...

上面返回的错误与我根本不逃避时相同。

Source  = "{Binding StringFormat='Images\Icons\{0}\Multi.png', ...

Source  = "{Binding StringFormat='{}Images\Icons\{0}\Multi.png', ...

以上两个可以防止错误发生,但会导致图像源为空。

有谁知道如何实现这一目标?

(澄清一下,如果祖父母的标签设置为“16”,那么我希望将图像源绑定到 Images\Icons\16\Multi.png ... 如果标签设置为“32”,那么我需要绑定源到Images\Icons\32\Multi.png。作为测试,我将祖父母标签设置为完整路径,并排除了字符串格式。与祖父母标签的相对绑定成功并显示了图像。只有在以下情况下才会失败我尝试仅使用字符串格式指定文件夹名称以指定路径的其余部分)。

4

1 回答 1

4

Binding 的 StringFormatter 属性仅在目标为 String 类型时才有效。否则,它将被简单地忽略。

您可以通过在绑定中添加转换器来解决此问题,该转换器采用格式字符串和标签,应用格式并将其转换为 ImageSource。在 C# 中,您的转换器将类似于:

public sealed class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (parameter == null || parameter.Equals(String.Empty)) parameter = "{0}";
        string path = String.Format((string) parameter, value);
        return new BitmapImage(new Uri(path));
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

获得转换器后,您可以将以下内容添加到 XAML 中的资源中:

<local:ImageConverter x:Key="ImageConverter" />

并将您的 Source 绑定修改为:

<Image x:Name="img"
       Stretch="None"
       Source="{Binding Parent.Parent.Tag, Converter={StaticResource ImageConverter}, 
                        ConverterParameter='Images\\Icons\\{0}\\Multi.png', 
                        RelativeSource ={RelativeSource Mode=Self}}" 
/>
于 2012-04-11T18:27:31.060 回答