2012-06-27 58 views
3

當我試圖創建在Visual Studio 2008中的Windows CE應用程序的繼承窗體,我得到錯誤信息:可視化窗體繼承不工作的智能設備/ Compact Framework的2008

設計師不能可以顯示這個文件,因爲它裏面的任何類都不能設計。設計者檢查了文件中的以下類:TestForm ---無法加載基類「InheritanceTest.BaseForm」。確保組件已被引用,並且所有項目都已建好。

Visual Studio 2008,版本9.0.30729.1 SP
Microsoft .NET Framework版本3.5 SP1。

我可以在不寫任何代碼的情況下得到問題,也無需以任何方式自定義表單。無論BaseForm是在同一個項目中還是在單獨的類庫中,都沒有什麼不同。該項目編譯好,問題是查看設計器中的繼承形式。它發生在我的兩臺電腦上。我正在使用C#。

程序,以獲得問題:
文件 - 新建項目 - Windows的C# - 智能設備 - CeInheritanceTest(.NET Framework 3.5中)
目標平臺 - Windows CE的 - 設備應用
添加 - 新項目 - 的Visual C#項目 - Windows窗體 - Windows窗體 - 「基本形式」
生成解決方案
添加 - 新項目 - 的Visual C#項目 - Windows窗體 - 繼承的形式 - 「TESTFORM」
- 繼承音素表示

如果我做對於普通的桌面應用程序來說,同樣的事情,窗體繼承沒有問題。

從網上搜索這個問題,看起來其他人正在使用緊湊框架來獲取表單繼承,所以我必須缺少一些東西。

我沒有編寫或修改任何代碼,所以基類不是抽象的,我沒有使用PInvoke。

有什麼建議嗎?

+0

我使用Windows 7 64位在System.ComponentModel.Design.ServiceContainer.AddService得到一個錯誤 (類型的serviceType,ServiceCreatorCallback回調,布爾推動)。我剛剛在一臺老式的32位XP機器上試過了,它都能正常工作。所以看起來問題可能與64位環境有關。它可以在64位開發機器上爲Compact Framework獲得表單繼承嗎​​? – urtlet

回答

2

發生此問題是因爲.NET CF控件的設計器元數據不會自動創建並編譯到您的項目中,以便爲設備保留二進制大小。您必須手動創建所謂的「設計時屬性文件」。

在包含基礎窗體的項目中,添加一個新項目。從已安裝的模板列表中選擇「設計時屬性文件」。它將有一個.xmta擴展名。如果你打開它,你會注意到它是一個xml文件。你可以添加一些選項來控制你的自定義控件/表單的設計和序列化,你可以查看更多關於這個的信息,但是如果你只是想能夠設計你的表單只需添加一個屬性:DesktopCompatible = True。

這裏有一個例子:

<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd"> 
    <Class Name="CeInheritanceTest.BaseForm">  
    <DesktopCompatible>true</DesktopCompatible> 
</Class> 
</Classes> 

確保在「類」節點的名字就是你的基本形式的全名。編譯你的項目,你應該可以在設計器中打開它。您還會注意到在項目的輸出文件夾中有一個帶有.asmmeta.dll擴展名的新程序集。這是包含設計器對具有可設計組件的庫的支持的程序集。 Visual Studio在嘗試設計.NET CF組件時會自動加載。

+0

謝謝你的回答。我曾嘗試添加.xmta文件,但它沒有任何區別。我已經找到了一些關於此的文檔,並且我還嘗試在類圖中添加了DesktopCompatible(true)作爲自定義屬性,它具有相同的效果,但無濟於事。我會看看在早上能否找到更多關於此的文檔。 – urtlet

+0

@urtlet在類文件中添加自定義屬性對於.NET CF組件無助。該xmta文件應該解決您的問題。你確定你記錄在文件中的類名是你的基類的完全限定名嗎? – pdriegen

+0

我試着直接添加.xmta文件,正如您所描述的那樣,我仔細檢查了限定名稱,但沒有任何區別。然後我嘗試將DesktopCompatible(true)作爲CustomAttribute添加到類**圖**中 - 當您使用緊湊框架時,實際上會創建一個xmta文件。然後我發現問題只出現在我的64位機器上;在舊的32位XP機器和32位Windows 7虛擬機上,可視化表單繼承功能適用於我。它不需要添加xmta文件。看來問題與我的開發機器是64位有關。 – urtlet

1

我努力爲這個問題找到解決方案,我終於解決了它。 除了增加真 到鹼形式應添加以下加載鹼形式的方法:

if (this.Site != null && this.Site.DesignMode == true) 
{ 
    // Design Mode 
} 
else 
{ 
    // Run-time 
} 

其防止代碼在Load事件處理程序從由設計者正在執行。 還有一件事,如果在繼承的形式下添加了Designer.cs接下來是

this.Load + = new System.EventHandler(this.BaseForm_Load); this.Closing + = new System.ComponentModel.CancelEventHandler(this.BaseForm_Closing);

刪除這些行,否則你將

+0

我很抱歉,但我不明白你的答案。你在基礎表單上設置了什麼?您是否已經在您的基礎表單上添加了Load事件處理程序,或者您是否添加了帶有一些代碼的Load事件處理程序? (在我的簡單測試中,我沒有任何基本形式或繼承形式的事件處理程序)。您是否能夠在64位機器上的VS 2008中使用Windows CE應用程序中的繼承窗體工作? – urtlet

+0

嗨,對不起,不清楚。你應該設置爲true是基本形式的自定義屬性。最簡單的方法是打開類圖,拖動基本表單,單擊基本表單並在打開的屬性窗口中鍵入DesktopCompatible(true)at custom attributes。對於加載和關閉事件處理程序,我自己創建它們以用於thr基形式。對於繼承形式,我不記得它們是自己創建的,還是我自己創建的,但應該刪除它們。 – Maja

+0

我認爲我們可能會有不同的情況。我已經嘗試過使用DesktopCompatible(true)屬性,但它沒有幫助。我根本沒有遇到事件處理程序的問題。 我剛剛完成了一些測試,仍然無法讓設計人員在我的64位機器上顯示繼承的表單。 而不是在評論中澄清你的答案,我認爲最好是編輯你的答案。 – urtlet