WPF XAML中的My.Resources是什么?

7
有没有一种方法可以通过Xaml访问My.Resources资源?就像这样:
<Image Source="{Binding MyImage,
    Source={x:Static my:Resources},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />

这是我得到的错误信息: \Application.xaml(122,36): error 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 Error: 16 : 无法从'' (类型为'Resources')获取'MyResources'值(类型为'Object')。BindingExpression:Path=MyResources[Ok]; DataItem='Resources' (HashCode=59109011); target element is 'Image' (Name='btnOk'); target property is 'Source' (type 'ImageSource') TargetParameterCountException:'System.Reflection.TargetParameterCountException: 参数计数不匹配。

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

2个回答

10
默认情况下,用于生成 Resources.resx 文件代码的工具是 VbMyResourcesResXFileCodeGenerator(项目项的“自定义工具”属性)。此工具生成模块,其中资源属性为 internal(Friend),因此 StaticExtension 无法访问它。要解决这个问题,应将 Resources.resx 的自定义工具更改为 PublicVbMyResourcesResXFileCodeGenerator,它将生成公共成员。
另外,VB 模块大致相当于静态(Shared)类,因此没有 Resources 的实例可用作绑定的源,因此不能为绑定指定路径。您应该直接设置要使用的属性的绑定源。
<Image Source="{Binding Source={x:Static my:Resources.MyImage},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />
注意:还有另一对工具可用于生成资源文件的代码:ResXFileCodeGeneratorPublicResXFileCodeGenerator。这些工具生成一个类而不是一个模块。
编辑:要使用的命名空间映射如下:
xmlns:myRes="clr-namespace:YourApplicationName.My.Resources"

我检查了一下,生成器是PublicVbMyResourcesResXFileCodeGenerator。 不过,我认为问题不是出于安全原因,因为Friend可以从程序集内部访问。 我认为问题出在My.Resources是一个命名空间,而My.Resource.TheResource是一个属性,这里没有类,看一下我上面引用的错误,你会发现这就是问题所在。 你还有什么其他想法吗? - Shimmy Weitzhandler
1
在.NET中,总是有一个类... 好吧,在那种情况下,那是一个模块,但它几乎与静态类相同。我认为您的命名空间映射不正确,请查看我的更新答案。 - Thomas Levesque
你真棒。我以为由于模块被隐藏(HideModuleNameAttribute),它不会起作用。 从这里我学到的是,总是要试一试,即使你不会损坏任何东西... - Shimmy Weitzhandler
1
有效的方法是:“编辑:要使用的命名空间映射如下:” - Shimmy Weitzhandler

3
在我的项目资源选项卡中,将my.resources的访问修饰符从“friend”更改为“public”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接