我正在爲緊湊框架(VS2008,目標平臺 - Windows Mobile 6.1,C#)中的標準ListView控件編寫擴展。緊湊框架中自定義控件中的設計時錯誤
該類當前非常空,只有一個方法覆蓋(請參閱下面的代碼)。我遇到的問題是:當我至少具有ListViewItem的窗體控件時,控件無法在設計時打開時進行初始化。
重現步驟:
- 創建一個智能設備類庫項目。
- 添加一個新類
ListViewEx : System.Windows.Forms.ListView
覆蓋的
OnHandleCreated
方法:protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); }
文件
DesignTimeAttributes.xmta
添加到項目:<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd"> <Class Name="CompleteNamespace.ListViewEx"> <DesktopCompatible>true</DesktopCompatible> <DesignTimeVisible>true</DesignTimeVisible> </Class> </Classes>
(更換
CompleteNamespace
用正確的命名空間。 )- 構建項目。
- 在同一個解決方案中創建一個新的智能設備應用程序項目。
- 從工具箱中將
ListBoxEx
拖動到Form1
上。 - 用任意文本添加一列和一個
ListViewItem
。 - 設置
View
ListViewEx
至Details
的財產。 - 保存,重建所有內容並關閉表單設計器選項卡。
- 重新打開表單設計器。
在這一點上,我希望看到我的列表視圖中有一個項目。相反VS拋出一個錯誤:
The control Microsoft.CompactFramework.Design.HeaderControl has thrown an unhandled exception in the designer and has been disabled.
Exception:
InvalidArgument=Value of '-1' is not valid for 'index'. Parameter name: index
Stack trace:
at Microsoft.CompactFramework.Design.HeaderControl.OnPaint(PaintEventArgs e)
at Microsoft.CompactFramework.Design.HeaderControl.WndProc(Message& m)
當我按下OK
,該ListViewEx佔位符看起來像這樣
而且,如果我離開開啓一段時間(約一分鐘)的形式VS也會引發新錯誤:
Code generation for property 'Items' failed. Error was: 'InvalidArgument=Value of '-1' is not valid for 'index'.
Parameter name: index'
一些注意事項:
- 如果
OnHandleCreated
被刪除,控制按預期工作。 - 控件在其中沒有項目時無法初始化。
- 該控件在運行時正常工作。
現在,我明白,明顯的解決方法是避免覆蓋OnHandleCraeted
。但是我想執行一些本地窗口方法,它們需要HWND句柄作爲初始化例程的一部分。而OnHandleCreated
似乎是正確的地方。 (控制失敗,只有base.OnHandleCreated
在方法的主體)
所以問題是:有沒有辦法讓OnHandleCreated
覆蓋並使控制工作在設計時間?或者另一個:何時何地最好執行需要HWND句柄的本地窗口方法?
當然,像臭蟲一樣的氣味,像你所做的那樣移動初始化可能是解決它的唯一好方法。 – ctacke 2014-09-25 14:22:10