2

我在 App.xaml 中有以下代码:

<Application x:Class="PcgTools.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:local="clr-namespace:PcgTools.ViewModels" 
         xmlns:res="clr-namespace:PcgTools.Resources"
         StartupUri="MainWindow.xaml"
         Startup="Application_Startup">
    <Application.Resources>
        <ResourceDictionary>
            ...
            <res:Strings x:Key="LocStrings"/>
        </ResourceDictionary> 
    </Application.Resources>
</Application>

(...是我删除的一些行以使示例更清晰)。

当我运行应用程序时,我收到以下错误(在尝试运行/调试之后直接):(从荷兰语翻译,所以可能不是 100% 字面上相等):

在 PcgTools.Resources.Strings 类型中没有找到匹配的构造函数。您可以使用指令 Arguments 或 FactoryMethod 来创建此类型。

文件 Strings.Designer.cs 中有一个构造函数:

namespace PcgTools.Resources {
...
public class Strings {
...

[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute
   ("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
    }

但是,它是生成的,所以我什至无法更改它。

顺便说一句,在不更改代码的情况下(大约一周前),但是大约 30% 的时间在调试时它给出了这个错误,并且在再次尝试后这个异常没有发生。

4

2 回答 2

2

你的PcgTools.Resources.Strings类有一个公共的默认构造函数吗?我认为它抱怨它无法创建对象,因为它找不到匹配的构造函数,并且由于您没有使用Arguments,它正在寻找一个默认构造函数(一个没有参数的构造函数)。构造函数必须是公共的,而不是内部的或私有的。

由于生成了代码,因此您需要找到一些解决方法。使用 FactoryMethods 可能会起作用。为此,请设置另一个类,例如

namespace PcgTools.Resources
{
    public static class StringResourceHelper
    {
        public static strings GetStringResources()
        {
            return new Resources.Strings();
        }
    }
}

然后在您的 XAML 中,您可以执行以下操作:

<res:Strings x:FactoryMethod="res:StringResourceHelper.GetStringResources" 
             x:Key="LocStrings"/>
于 2013-01-15T20:34:11.753 回答
0

也可以看看:

http://dotnet.dzone.com/news/did-you-know-silverlight-class

简而言之:不要将命名空间命名为 .Resources 它不应该命名为 Resources 而是其他名称,否则您将收到上述错误。

编辑:但是,似乎在更改资源字符串之后,被覆盖的文件(..Designer.cs)仍然包含内部而不是公共构造函数,从而导致问题出现错误。

于 2013-01-15T21:42:09.637 回答