有没有办法通过Xaml访问My.Resources?
喜欢这个
<Image Source="{Binding MyImage,
Source={x:Static my:Resources},
Converter={StaticResource MyBitmapToImageSourceConverter}}" />
这是我得到的错误: \ Application.xaml(122,36):错误MC3029:'my:Resources'成员无效,因为它没有合格的类型名称。
上述情况当然不起作用。
注意:转换器仅供参考。
我想到了一个想法,这可能是一个很好的方法,如果它可以工作,我为资源创建了一个包装类:
Public Class Resources
Public Shared ReadOnly m_Resources As New Resources
Public Shared ReadOnly Property Resources() As Resources
Get
Return m_Resources
End Get
End Property
Public ReadOnly Property MyResources(ByVal name As String) As Object
Get
Return My.Resources.ResourceManager.GetObject(name)
End Get
End Property
End Class
然后在我的绑定中,我试着像这样访问它:
<Setter Property="ImageSource"
Value="{Binding MyResources[Ok], Source={x:Static src:Resources.Resources}}"/>
但我仍然收到以下消息:
System.Windows.Data错误:16:无法从''(类型'资源')获取'MyResources'值(类型'对象')。 BindingExpression:路径=为MyResources [确定]; DataItem ='Resources'(HashCode = 59109011); target元素是'Image'(Name ='btnOk'); target属性为'Source'(类型'ImageSource')TargetParameterCountException:'System.Reflection.TargetParameterCountException:参数计数不匹配。
BTW,我在MyResources Getter中放置了一个测试MessageBox,似乎根本没有访问该属性。
答案 0 :(得分:9)
问题在于,默认情况下,为Resources.resx文件生成代码的工具是VbMyResourcesResXFileCodeGenerator
(项目项的“自定义工具”属性)。此工具生成一个模块,其中资源属性是内部的(朋友),因此StaticExtension无法访问它。要解决该问题,您应该将Resources.resx的自定义工具更改为PublicVbMyResourcesResXFileCodeGenerator
,这将生成公共成员。
此外,VB模块大致相当于静态(Shared)类,因此没有可用作绑定源的Resources实例,因此您无法为绑定指定Path。您应该将绑定源直接设置为所需的属性:
<Image Source="{Binding Source={x:Static my:Resources.MyImage},
Converter={StaticResource MyBitmapToImageSourceConverter}}" />
注意:还有另一对工具可用于生成资源文件的代码:ResXFileCodeGenerator
和PublicResXFileCodeGenerator
。这些工具生成一个类而不是模块。
编辑:要使用的命名空间映射如下:
xmlns:myRes="clr-namespace:YourApplicationName.My.Resources"
答案 1 :(得分:3)
在my.project资源选项卡中将my.resources的访问修饰符从freind更改为public。