7

有没有办法通过 Xaml 访问 My.Resources?

像这样

<Image Source="{Binding MyImage,
    Source={x:Static my:Resources},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />

这是我得到的错误: \Application.xaml(122,36): error MC3029: 'my:Resources' member is not valid 因为它没有合格的类型名称。

以上当然行不通。

注意:转换器仅用于说明。


更新:

我想到了一个想法,如果可行,这可能是一个好方法,我为资源创建了一个包装类:

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:Path=MyResources[Ok]; DataItem='资源' (HashCode=59109011); 目标元素是“图像”(名称=“btnOk”);目标属性是'Source'(类型'ImageSource')TargetParameterCountException:'System.Reflection.TargetParameterCountException:参数计数不匹配。

顺便说一句,我在 MyResources Getter 中放置了一个测试 MessageBox,似乎根本没有访问该属性。

4

2 回答 2

9

问题是,默认情况下,为 Resources.resx 文件生成代码的工具是VbMyResourcesResXFileCodeGenerator(项目项的“自定义工具”属性)。该工具生成一个Module,其中资源属性是内部的(Friend),因此StaticExtension 无法访问它。要解决这个问题,您应该将 Resources.resx 的自定义工具更改为PublicVbMyResourcesResXFileCodeGenerator,这将生成公共成员。

此外,VB 模块大致相当于一个静态(共享)类,因此没有可用作绑定源的资源实例,因此您不能为绑定指定路径。您应该将绑定源直接设置为您想要的属性:

<Image Source="{Binding Source={x:Static my:Resources.MyImage},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />

注意:还有另外一对工具可用于为资源文件生成代码:ResXFileCodeGeneratorPublicResXFileCodeGenerator. 这些工具生成一个类而不是一个模块。

编辑:要使用的命名空间映射如下:

xmlns:myRes="clr-namespace:YourApplicationName.My.Resources"
于 2009-09-14T13:48:47.737 回答
3

在 my.project 资源选项卡中将 my.resources 的访问修饰符从 freind 更改为 public。

于 2011-09-16T11:21:49.433 回答