在我的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"
...
答案 0 :(得分:21)
问题是基类被定义为抽象。这导致设计师失败。 Laurent Bugnion博客的评论部分更详细地描述了这个问题:http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx
答案 1 :(得分:8)
我找到了一个非常有用的解决方案: http://www.progware.org/Blog/post/WPF-Designer-Error-Could-not-create-an-instance-of-type.aspx
此链接说明了WPF设计器窗口如何运行构造函数以在XAML中显示UI以及补救措施: 将以下代码段添加到可能给出错误的构造函数代码的任何部分:
if(!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
//code producing exception
}
函数名称是自解释的。 :) 此链接还提供有关使用XAML调试问题的解决方案。
答案 2 :(得分:4)
另一个可能的原因,正如我们刚才在这里找到的,所以我为未来的用户添加了这个答案,如果项目托管在不受信任的来源上,例如文件服务器。
在这种情况下,设计人员不会加载程序集,因此给出了相同的“无法创建实例...”错误。该解决方案仍然可以构建和调试。
答案 3 :(得分:2)
另一个原因。我的控件类有一个从资源初始化的静态字段,如下所示:
static Color s_ImgColor = (Color)TheApp.Resources["PhoneForegroundColor"];
这将在XAML编辑器中抛出空引用异常,因为资源在设计模式下不可用。如果它不是颜色资源(例如,画笔),这不会是一个问题,但是值类型的类型转换会引发空引用。
答案 4 :(得分:1)
另一个可能的原因。
我有一个用户控件,它有子控件,可以生成事件,例如list_changed列表控件。 select_changed事件处理程序对其他子控件进行更改。
在初始化期间,列表框的选定项属性会更改并触发selection_changed事件。处理程序尝试更新其他子控件但不能,因为它们尚未实例化。这会导致空指针异常并导致问题。
一旦处理了空指针问题,控件就可以实例化并出现在父控件中。
答案 5 :(得分:0)
我遇到的问题是我的MVVM类在构造函数中访问了数据库,这就是问题所在,它会引发异常。我只需要检查应用程序是否在设计模式下运行。
答案 6 :(得分:0)
在WinForms中,如果使用自定义TypeDescriptionProvider
通知设计者具体实现,则可以使用带有抽象控件的设计器:
我正在使用this answer中的解决方案来解决另一个与this article相关联的问题。本文建议使用自定义TypeDescriptionProvider
和抽象类的具体实现。设计人员会询问自定义提供程序要使用哪些类型,并且您的代码可以返回具体类,以便设计人员在您完全控制抽象类如何作为具体类出现时感到高兴。
答案 7 :(得分:0)
另一种可能的情况(对于WP来说这至少是SL的实际情况):
如果您创建了课程的实例(例如<local:MyDataSource />
),那么应该是公开的。如果您的类是内部的,它将在设计时工作,但在运行时会因此异常而失败。
答案 8 :(得分:0)
我之所以遇到这个错误很简单,但我很难追查。我的转换器类不公开。只需更改类的可访问性即可修复它。
public class StringToLowerConverter : IValueConverter
答案 9 :(得分:0)
我不知道问题出在哪里,但是我这样解决了:
您不应在父类的构造函数中执行代码,而应在父类的构造函数中执行代码。
您可以在BaseClass中创建一个从父类的构造函数执行的方法。
答案 10 :(得分:0)