1

我正在爲緊湊框架(VS2008,目標平臺 - Windows Mobile 6.1,C#)中的標準ListView控件編寫擴展。緊湊框架中自定義控件中的設計時錯誤

該類當前非常空,只有一個方法覆蓋(請參閱下面的代碼)。我遇到的問題是:當我至少具有ListViewItem的窗體控件時,控件無法在設計時打開時進行初始化。

重現步驟:

  1. 創建一個智能設備類庫項目。
  2. 添加一個新類ListViewEx : System.Windows.Forms.ListView
  3. 覆蓋的OnHandleCreated方法:

    protected override void OnHandleCreated(EventArgs e) 
    { 
        base.OnHandleCreated(e); 
    } 
    
  4. 文件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用正確的命名空間。 )

  5. 構建項目。
  6. 在同一個解決方案中創建一個新的智能設備應用程序項目。
  7. 從工具箱中將ListBoxEx拖動到Form1上。
  8. 用任意文本添加一列和一個ListViewItem
  9. 設置ViewListViewExDetails的財產。
  10. 保存,重建所有內容並關閉表單設計器選項卡。
  11. 重新打開表單設計器。

在這一點上,我希望看到我的列表視圖中有一個項目。相反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佔位符看起來像這樣the error text which is displayed in place of the normal control content

而且,如果我離開開啓一段時間(約一分鐘)的形式VS也會引發新錯誤:

Code generation for property 'Items' failed. Error was: 'InvalidArgument=Value of '-1' is not valid for 'index'.

Parameter name: index'

一些注意事項:

  1. 如果OnHandleCreated被刪除,控制按預期工作。
  2. 控件在其中沒有項目時無法初始化。
  3. 該控件在運行時正常工作。

現在,我明白,明顯的解決方法是避免覆蓋OnHandleCraeted。但是我想執行一些本地窗口方法,它們需要HWND句柄作爲初始化例程的一部分。而OnHandleCreated似乎是正確的地方。 (控制失敗,只有base.OnHandleCreated在方法的主體)

所以問題是:有沒有辦法讓OnHandleCreated覆蓋並使控制工作在設計時間?或者另一個:何時何地最好執行需要HWND句柄的本地窗口方法?

+0

當然,像臭蟲一樣的氣味,像你所做的那樣移動初始化可能是解決它的唯一好方法。 – ctacke 2014-09-25 14:22:10

回答

2

嗯,我設法讓事情工作。我已將我的初始化設置爲OnParentChanged。我知道它可能會不止一次地被調用,並且我被覆蓋了。

雖然味道像一個骯髒的黑客。