【问题标题】:XamlParseException in app.xaml resource stringsapp.xaml 资源字符串中的 XamlParseException
【发布时间】:2013-01-15 20:26:39
【问题描述】:

我在 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% 的时间在调试时给出了这个错误,并且在再次尝试后这个异常没有发生。

【问题讨论】:

    标签: c# wpf string xaml resources


    【解决方案1】:

    您的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"/>
    

    【讨论】:

    • 是的,它有一个默认构造函数...我已将其添加到问题中。
    • 它也必须是公开的。我最初应该在我的回答中这么说。我已经更新了我的答案。
    • 我已经继续并添加了一个示例,说明您可以如何解决这个问题,因为您的代码是自动生成的。
    • 我将其公开并运行...谢谢。但是,当我更改资源字符串时,文件会重新生成并返回内部...但是:即使这样,应用程序也会启动。无论如何,您帮助了我,尽管真正的问题和解决方案可能在其他地方。我会接受这个答案。
    • 询问stackoverflow.com/questions/14347181/…中的xaml2009错误
    【解决方案2】:

    另见:

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

    简而言之:不要将命名空间命名为 .Resources 它不应该被命名为 Resources ,否则你会得到上面描述的错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多