gix*_*gix 12 wpf resources xaml image mvvm
假设我想显示每个对象应该具有名称和合适图像的对象列表(例如带有图标的MenuItems,或带有文本和图像的按钮).
所有的实施例和方案在视图模型露出的图像作为到PNG文件的路径,然后结合的Source的Image这一点.但是,如果我想使用矢量图像(例如DrawingImage在本地ResourceDictionary)?从视图模型中公开DrawingImage似乎很糟糕,因为我必须存储对应用程序/窗口/用户控件/ ...的引用(并且建议不要从视图模型中公开这样的XAML对象).
因此,更好的方法是在视图模型中使用字符串标识符,然后以某种方式选择适当的资源.如果该标识符是资源键,则此代码段看起来很诱人,但不起作用:
<Image Source="{StaticResource {Binding Icon}}"/>
Run Code Online (Sandbox Code Playgroud)
我找到了两个解决方法,虽然它们对我不起作用.
第一个是使用正常绑定到图标的转换器查找资源Application.Current.如果资源存储在我认为的其他地方(并且我最初碰到这个问题的情况没有运行应用程序,因为它是一个Window选择要启动的应用程序!),这不起作用.
第二种解决方法是使用从传递的绑定StaticResourceExtension中获取的标记扩展派生的标记扩展ResourceKey:
<Image Source="{local:BindableStaticResource {Binding Icon}"/>
Run Code Online (Sandbox Code Playgroud)
这个看起来很整洁,因为它可以使用本地资源,也可以用于其他事情.但是在使用它时我总是遇到异常("无法找到名为{FooIcon}的资源.",显示正确的XAML文件和扩展名的位置).即使是从StaticResourceExtension刚刚将资源键传递给基础构造函数的空资源扩展也不起作用,我无法解释原因.只是使用StaticResourceExtension工作得很好.
我有什么想法可以解决第二种方法,甚至是更好的解决方案?
我注意到它直接使用它确实有效:
<Window>
<Window.Resources>
<DrawingImage x:Key="SomeIcon"/>
</Window.Resources>
<Image Source="{BindableStaticResource {Binding Icon}}"/>
</Window>
Run Code Online (Sandbox Code Playgroud)
但例如在一个DataTemplate.虽然正常StaticResourceExtension情况下两种情况都有效,但我感到困惑的是出了什么问题.
自定义 MarkupExtensions 中存在一个错误,不允许您在类似的属性中使用它们。
解决方法 1:将属性声明为元素,如下所示:
<Image>
<Image.Source>
<local:BindableStaticResource Binding={Binding Icon}" />
</Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)
解决方法 2:如果您通过将 MarkupExtension 放入另一个程序集中并引用它来预编译它,那么它会再次工作。这可能就是为什么您看到它在主窗口中工作,但在 DataTemplate 中不起作用。
| 归档时间: |
|
| 查看次数: |
7897 次 |
| 最近记录: |