2009-10-01 306 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