【问题标题】:Silverlight resource constructor always return to internalSilverlight 资源构造函数总是返回到内部
【发布时间】:2010-10-19 18:27:44
【问题描述】:

当我修改我的资源文件 (.resx) 添加文本或修改时,我的资源的构造函数总是转到内部,然后,当我运行我的 silverlight 时,我的绑定 XAML 出现错误。

有没有办法避免这种情况?我需要进入我的资源的设计器并将构造函数公开以解决问题

我在我的 xaml 文件中使用这样的资源

 <UserControl.Resources>
        <resources:LibraryItemDetailsView x:Key="LibraryItemDetailsViewResources"></resources:LibraryItemDetailsView>
    </UserControl.Resources>


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock>

【问题讨论】:

  • 我也遇到了同样的问题,很烦人...
  • 我在 WPF 中完成了this,应该也适用于 Silverlight。

标签: c# silverlight resources resx


【解决方案1】:

另一种无需更改代码的方法如下。对我来说效果很好。

http://guysmithferrier.com/post/2010/09/PublicResourceCodeGenerator-now-works-with-Visual-Studio-2010.aspx

【讨论】:

  • 这是最好的答案。安装 exe 并将资源文件的自定义工具属性设置为“PublicResourceCodeGenerator”。
【解决方案2】:

您可以创建一个通过属性公开资源的公共类:

public class StringsWrapper
{
    private static LibraryItemDetailsView _view = null;

    public LibraryItemDetailsView View
    {
        get
        {
            if (_view == null)
            {
                _view = new LibraryItemDetailsView();
            }
            return _view;
        }
    }
}

然后在您的 XAML 中您可以访问您的资源:

<UserControl.Resources>
    <StringsWrapper x:Key="LibraryItemDetailsViewResources"></StringsWrapper>
</UserControl.Resources>


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=View.FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock>

这样resx构造函数可以是内部的!

【讨论】:

    【解决方案3】:

    好吧,我所做的是将命令行实用程序添加到每个 Silverlight 项目的预构建事件中,将每个 internal string 替换为 public :)

    您可以通过以下方式编辑构建前和构建后事件:右键单击项目 -> Properties -> Build Events

    我使用了一个名为 RXFIND 的实用程序,它是免费的,并且可以使用 RegEx 正则表达式替换选定文件中的字符串。

    这是我正在使用的命令行:

    "$(SolutionDir)ThirdParty\rxfind\rxfind.exe" "$(ProjectDir)Resources\*.Designer.cs" "/P:internal " "/R:public " /Q /B:2
    

    请注意,我所有的资源都位于每个项目的 Resource 目录下,命令行实用程序位于 \ThirdParty\rxfind 目录中

    【讨论】:

      【解决方案4】:

      我也有同样的错误。为了解决这个问题,我刚刚创建了一个public class,它继承自表示资源文件的类,知道它也必须是公共类,这是我的 exep:

      public class TrackResourceWrapper : TrackResource
      {
      }
      

      与: TrackResourceWrapper 是继承类 TrackResource是位于代码资源文件后面的类(公共类)

      【讨论】:

        【解决方案5】:

        简单地说:

        1. 添加一个继承自资源类的新类
        2. 在 App.xaml 文件中,修改您创建的资源类

        完成!

        【讨论】:

          【解决方案6】:

          这样做的原因是您不应该自己实例化该类。相反,您应该始终使用 ConsoleApplication1.Resource1.ResourceManager,它本身会为您实例化该类。

          这里,ConsoleApplication1 是程序集的名称,Resource1 是资源文件的名称。

          【讨论】:

          • 你能给我一个绑定的例子吗?
          • 您提到的 ResourceManager 不会公开字符串变量,因此它不会是可绑定的。您必须使用 GetX 方法从中获取任何值。
          【解决方案7】:

          我创建了一个宏来为我编辑的每个文件执行此操作。我仍然必须记住运行它,但它要快得多。请参阅my post

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-17
            • 2012-08-07
            • 2020-12-12
            • 1970-01-01
            相关资源
            最近更新 更多