【问题标题】:Binding Image.Source to string with umlauts - file not found将 Image.Source 绑定到带有变音符号的字符串 - 找不到文件
【发布时间】:2019-09-17 21:34:30
【问题描述】:

如何将 Image.Source 绑定到包含变音符号的文件名?

<StackPanel>
    <Image Source="{Binding Image1}" />
    <Image Source="{Binding Image2}" />
</StackPanel>
// DataContext
public string Image1 { get; set; } = "/test.png";
public string Image2 { get; set; } = "/testä.png";

这两个图像都通过构建操作“内容”和“如果更新则复制”包含在内。

Image1 在运行时可见,而 Image2 不可见。 Image2 在输出窗口中产生以下错误:

“TargetDefaultValueConverter”转换器无法转换值 '/testä.png'(输入“字符串”);将使用后备值,如果 可用的。绑定表达式:路径=Image2;数据项='主窗口' (名称='');目标元素是'图像'(名称='');目标属性是 'Source'(类型'ImageSource')IOException:'System.IO.IOException:死 资源 "test%c3%a4.png" kann nicht gefunden werden.

我从这里 (How to put a unicode character in XAML?) 尝试了一些版本,但没有成功。

编辑

显然,{Binding Image1} 将“/test.png”转换为“pack://application:,,,/WpfImageBindingUmlauts;component/test.png”,而不是在文件系统上搜索(正如我所怀疑的那样)。

解决方案 1 我设法通过使用像“C:\test.png”这样的完整文件路径来强制在文件系统上进行绑定。这也适用于“C:\testä.png”。

解决方案 2 对于@Andrew Stephens 报告没有遇到同样的问题,我很好奇,发现前面提到的代码在使用构建操作“资源”时可以完美运行。 (背景:我首先使用构建操作“内容”,将 png 包含到 clickonce 部署中)

【问题讨论】:

  • 我刚刚复制了这个,它对我有用!现在,如果我删除该文件,我会得到与您相同的“转换器”错误,但后一部分是 FileNotFoundException 而不是像您这样的 IOException: FileNotFoundException:'System.IO.FileNotFoundException: Could not find file 'C:\Temp \testä.png'。文件名:'C:\Temp\testä.png'。不确定这是否对您有帮助?!
  • 这是出乎意料的。您的系统是否也搜索文件名“test%c3%a4.png”?
  • 抱歉,我最初使用的是绝对路径(有效),但我发现相对路径像你的一样失败。它似乎与Image.Source 属性的内置字符串转换器有关。您必须编写自己的转换器来处理它。请参阅此答案及其后面的答案:stackoverflow.com/a/17267458/981831
  • 谢谢。实际上,我可以使用绝对路径,不用费心创建自己的 IValueConverter。

标签: wpf binding


【解决方案1】:

您可以从源属性返回BitmapImage,而不是返回string

public BitmapImage Image2 { get; set; } = new BitmapImage(new Uri("/testä.png", UriKind.Relative));

那么就不会涉及到可能发生故障的转换器。

【讨论】:

  • 你是对的,这在技术上应该可行。我没有在问题中提到,但我有一个可过滤的 ListView 包含数千个这样的图像。将所有内容都保存在 RAM 中可能太多了。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多