【问题标题】:My.Resources in WPF XAML?WPF XAML 中的 My.Resources?
【发布时间】:2010-11-28 01:09:41
【问题描述】:

有没有办法通过 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 错误:16:无法从“”(类型“资源”)获取“MyResources”值(类型“对象”)。 BindingExpression:Path=MyResources[Ok]; DataItem='资源' (HashCode=59109011);目标元素是“图像”(名称=“btnOk”);目标属性是'Source'(类型'ImageSource') TargetParameterCountException:'System.Reflection.TargetParameterCountException: 参数计数不匹配。

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

【问题讨论】:

    标签: wpf vb.net xaml my.resources


    【解决方案1】:

    问题在于,默认情况下,为 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"
    

    【讨论】:

    • 我查了一下,生成器是 PublicVbMyResourcesResXFileCodeGenerator。无论如何,我不认为出于安全原因的问题,Friend 可以从程序集中访问。我认为问题是 My.Resources 是一个命名空间,而 My.Resource.TheResource 是一个属性,这里没有类,看看我上面引用的错误,你会发现这就是原因。你有什么进一步的想法吗?
    • .NET 中总是有一个类......好吧,在这种情况下,它是一个模块,但它几乎与静态类相同。我认为您的命名空间映射不正确,请参阅我的更新答案
    • 你就是男人。我想既然模块是隐藏的(HideModuleNameAttribute),它就行不通了。我从这里学到的就是永远试一试,即使你不会杀死任何东西......
    • 有效的是“编辑:要使用的命名空间映射如下:”
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2013-09-04
      • 2011-01-18
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多