【问题标题】:WPF Designer "Could not create an instance of type"WPF 设计器“无法创建类型的实例”
【发布时间】:2010-10-26 02:01:06
【问题描述】:

在我的 UI XAML 中,我本质上是从包含多个表单共有的功能的类“BaseView”继承的,但这会阻止设计器显示表单:“无法创建 BaseView 类型的实例”。代码将编译并运行,但无法在 Designer 中看到表单令人沮丧。有没有更好的办法?谢谢。

XAML:

<vw:BaseView 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vw="clr-namespace:ReviewClient"   
    x:Class="ReviewClient.MainPage"

...

【问题讨论】:

  • ReviewClient 是 XAML 的父程序集吗?如果不是,您需要将 ReviewClient 引用添加到包含此 XAML 文件的程序集。
  • ReviewClient 是本地命名空间。

标签: wpf xaml inheritance designer


【解决方案1】:

是的!我解决了。在我将“控制显示选项”设置为“仅显示平台控制”后,表单最终显示在“显示和错误消失”上。查看图片以找到它。

【讨论】:

  • 好吧,你只是绕过渲染嵌套控件,但这对我很有帮助,因为我想在启用它之后禁用它,不小心。
【解决方案2】:

我不知道是什么问题,但我是这样解决的:

您不应该在 BaseClass 的构造函数中执行代码,而是从父类的构造函数执行代码。

您在从父类的构造函数执行的 BaseClass 中创建一个方法。

【讨论】:

    【解决方案3】:

    我收到此错误的原因很简单,但我很难找到。我的转换器类不公开。只需更改类的可访问性即可修复它。

        public class StringToLowerConverter : IValueConverter
    

    【讨论】:

      【解决方案4】:

      还有另一种可能的情况(对于 WP 来说至少 SL 是这样的):

      如果你创建你的类的实例(例如&lt;local:MyDataSource /&gt;),那么它应该是公开的。如果您的类是内部的,它将在设计时工作,但在运行时会因此异常而失败。

      【讨论】:

        【解决方案5】:

        我找到了一个非常有用的解决方案: http://www.progware.org/Blog/post/WPF-Designer-Error-Could-not-create-an-instance-of-type.aspx.

        此链接说明 WPF 设计器窗口如何运行构造函数以在 XAML 中显示 UI 和补救措施: 将以下 sn-p 添加到可能会出错的构造函数代码的任何部分:

        if(!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
           //code producing exception         
        }
        

        函数名称是不言自明的。 :) 此链接还提供有关 XAML 调试问题的解决方案。

        【讨论】:

          【解决方案6】:

          在 WinForms 中,如果您使用自定义 TypeDescriptionProvider 通知设计器具体实现,则可以将设计器与抽象控件一起使用:

          我将this answer 中的解决方案用于另一个问题,该问题链接this article。文章推荐使用自定义TypeDescriptionProvider 和抽象类的具体实现。设计者会询问自定义提供者要使用哪些类型,并且您的代码可以返回具体类,以便设计者在您完全控制抽象类如何显示为具体类时感到高兴。

          【讨论】:

            【解决方案7】:

            我的问题是我的 MVVM 类可以访问构造函数中的数据库,这就是问题所在,它引发了异常。我只需要检查应用程序是否在设计模式下运行。

            【讨论】:

              【解决方案8】:

              另一个原因。我的控件类有一个从资源初始化的静态字段,如下所示:

               static Color s_ImgColor = (Color)TheApp.Resources["PhoneForegroundColor"];
              

              这将在 XAML 编辑器中引发空引用异常,因为资源在设计模式下不可用。如果它不是颜色资源(比如画笔),这不会是问题,但类型转换为值类型会抛出空引用。

              【讨论】:

                【解决方案9】:

                还有另一个可能的原因。

                我有一个用户控件,它具有生成事件的子控件,例如selection_changed 在列表控件上。 select_changed 事件处理程序对其他子控件进行更改。

                在初始化期间,列表框的选定项属性发生变化并触发 selection_changed 事件。处理程序尝试更新其他子控件但不能因为它们尚未被实例化。这会导致空指针异常并导致问题。

                一旦处理了空指针问题,控件就可以被实例化并出现在父控件中。

                【讨论】:

                  【解决方案10】:

                  另一个可能的原因,正如我们刚刚在这里发现的,所以我为未来的用户添加了这个答案,是项目是否托管在不受信任的源上,例如文件服务器。

                  在这种情况下,设计器不会加载程序集,因此会出现相同的“无法创建实例...”错误。该解决方案仍然可以构建和调试。

                  【讨论】:

                    【解决方案11】:

                    问题是基类被定义为抽象类。这导致设计者失败。这个问题在 Laurent Bugnion 博客的 cmets 部分有更详细的描述:http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

                    【讨论】:

                    • 谢谢!我自己也遇到了这个问题。
                    • 我在您写下的链接中看不到设计师的解决方案。
                    • 解决方案是使基类具体化(即从基类中删除 abstract 关键字)。不是一个非常令人满意的解决方案,但它确实有效。
                    • 我把它放在我的代码中: /// /// todo: 这个类应该是抽象的。但是,由于 XAML 编辑器中的错误,所有基于此的控件都将显示为好像处于错误状态(尽管它们运行良好)。 /// 因此它目前不是抽象的。修复此错误后,应更改此设置。 ///
                    • Expression Blend 4 能够呈现从抽象类继承的视图。不确定早期版本。
                    猜你喜欢
                    • 1970-01-01
                    • 2018-05-25
                    • 2020-02-02
                    • 2021-11-15
                    • 2021-10-01
                    • 1970-01-01
                    • 2016-10-04
                    • 2021-10-24
                    • 2020-05-10
                    相关资源
                    最近更新 更多