我在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%的时间在调试它时发生了这个错误,并且在再次尝试之后没有发生此异常。
答案 0 :(得分: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"/>
答案 1 :(得分:0)
另见:
http://dotnet.dzone.com/news/did-you-know-silverlight-class
简而言之:不要命名空间.Resources 它不应该被命名为Resources而是其他东西,否则你将得到如上所述的错误。
编辑:但是,在更改资源字符串后,覆盖的文件(..Designer.cs)仍然包含内部而不是公共构造函数,导致问题出错。