2009-10-01 140 views
1

又一个奇怪的WPF错误:WPF自定义控件XAML null错误

我在简单的XAML页面中有一个自定义控件。该项目建设和运行完美,没有错误。

这里的XAML:

<Window x:Class="Grapher2.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:graph="clr-namespace:Grapher2" 
Title="Grapher" Width="800" Height="600"> 

<StackPanel Name="container" Width="700" Height="500"> 
    <graph:GraphCanvas x:Name="graphCanvas" Width="700" Height="500" Background="#ddd" /> 
</StackPanel> 

但是当我尝试在XAML设计器窗口来查看XAML页面,我得到的消息:

"Problem Loading--The document contains errors that must be fixed..."

当我打的“重新加载设计器”链接,在错误列表中弹出一条错误消息:

"Object reference not set to an instance of an object"

以“graph:GraphCanvas ...”开头的行加下划线。

我原本是发展我们的开发服务器上,并在那里,一切都是一样的,除了错误是:

"Request for the permission of type 'System.Security.Permissions.SecurityPermission (...blah blah... failed.)"

再次,一切完美,但我不能查看的页面XAML设计师窗口,这使我无法开发应用程序的其余部分。

我试过清理,建筑,重建以及这些命令的所有命令组合,但都没有成功。

编辑:

请记住这是我的第一个自定义的控制,我可以做一些可怕的,可怕的错误。就像我说的那样,该应用程序编译和运行非常漂亮,所以我有点神秘。

EDIT#2:

我衍生画布不是局部类。根据我对InitializeComponent工作原理的了解(What does InitializeComponent() do, and how does it work in WPF?),没有自动生成的部分类包含链接到我的控件的InitializeComponent。同样,除非打破XAML设计视图,否则该控件完全没有它。

回答

3

我最近有类似的问题。基本上我的理解是,在设计器中,某些事情发生的顺序与运行时的顺序不完全相同,有些事情在设计期间实际上是空的。

我以这种方式解决了这个问题:在我的控制中注释了大部分代码,在Cider中没有错误,然后取消注释,直到再次出现错误。然后,当错误的来源被本地化时,我围绕着有问题的部分

if (something != null) 
{ 
... 
} 

即使当我觉得没有办法可能为空。过了一段时间,我摆脱了错误。

不是很“科学”的方法,但它解决了我的问题。 :)

+0

我已经完成了你之前描述的任何事情(通常是所有“真实”研究都没有发生的最后一次努力)。在阅读你的文章后,我在这里试了一下,发现我在Initialized事件的控件窗口中添加了一个KeyUp事件监听器。显然,设计者还运行初始化事件 - 父窗口为空。 谢谢! – Klay 2009-10-05 13:36:51

0

不幸的是,Visual Studio 2008中的Cider设计者存在一些问题,这种类型的错误太常见了。 VS2010中的版本得到了很大的改进,但是当你在VS2008中遇到这个问题时,这并不舒适。

+0

不试图争议,但如果您可以添加一个链接到一个参考,显示这是一个苹果酒错误,而不是我可以修复,我会接受这个答案。如果我在第二天得到足够的佐证,我也会接受。 – Klay 2009-10-01 15:45:05

0

我不确定什么是“Grapher2”,但您可能会检查以确保在其构造函数中没有代码在设计器实例化时无法正确运行。像数据库调用一样会有问题。

+0

Grapher2是我的自定义控件。这里有个想法:每个自定义控件都需要有自己的XAML文件吗?这一个没有。 – Klay 2009-10-01 16:26:43

+0

自定义控件不会有XAML文件。它将在generic.xaml文件中以ResourceDictionary的形式存储主题。 你真的想要一个自定义控件(你需要消费者定义主题)吗?或者用户控制就足以满足你正在做的事情。 – DancesWithBamboo 2009-10-01 23:48:29

+0

是的,我正在做一个响应鼠标移动的图像的低级像素操作:http://stackoverflow.com/questions/1487831/wpf-2d-high-performance-graphics。但我完全不需要消费者定义的主题。 – Klay 2009-10-02 13:01:35

0

我见过类似的问题。

这只是一个部分解决方案,因为它不会在设计模式下在父级渲染,但它会摆脱错误。这是迄今为止我能找到的最佳解决方案。

在自定义控件的构造函数中。

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
      InitializeComponent(); 

希望有帮助,或者它可以帮助您找到更好的解决方案。如果你请张贴这样我就可以使用它;)

编辑
我得到不使用上面的代码时,不同的错误: 无法创建类型'

,可能的一个实例是我看到的另一个问题,但听起来可能是相关的。

+0

我的控件扩展了Canvas。但它不识别InitializeComponent。这可能是一个问题吗? – Klay 2009-10-01 16:28:58

+0

我对WPF相当陌生,但我认为你可能会做些什么。我只是试图扩展Canvas,它有一个InitializeComponent方法。 – Crispy 2009-10-01 17:20:57

+0

你究竟如何扩展Canvas?您是否添加新项目>类并在声明的末尾输入“:Canvas”?我就是这么做的。你的班级是部分的吗? – Klay 2009-10-01 17:56:10