我正在为紧凑框架(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
的{{1}}属性设置为ListViewEx
。此时我希望看到我的列表视图中包含一个项目。相反,VS会抛出一个错误:
控件Microsoft.CompactFramework.Design.HeaderControl已抛出 设计器中未处理的异常并已被禁用。
例外:
InvalidArgument ='-1'的值对'index'无效。 参数名称:index
堆栈追踪:
在Microsoft.CompactFramework.Design.HeaderControl.OnPaint(PaintEventArgs e)
在Microsoft.CompactFramework.Design.HeaderControl.WndProc(Message&amp; m)
当我按Details
时,ListViewEx占位符看起来像
此外,如果我将表格打开一段时间(约一分钟),VS也会抛出一个新错误:
属性'Items'的代码生成失败。错误是:'InvalidArgument ='-1'的值对'index'无效。
参数名称:index'
一些注意事项:
OK
,则控件按预期工作。现在,我知道明显的解决方法是避免覆盖OnHandleCreated
。但是我想执行一些需要HWND句柄的本机windows方法作为初始化例程的一部分。并且OnHandleCraeted
似乎是正确的地方。 (控件失败,只在方法体中有OnHandleCreated
)
所以问题是:有没有办法保持base.OnHandleCreated
覆盖并使控件在设计时工作?或者另一个:何时何地最好执行需要HWND处理的本机窗口方法?
答案 0 :(得分:2)
好吧,我设法使事情有效。我已将初始化设置为OnParentChanged
。我知道它可能不止一次被召唤,我得到了覆盖。
虽然闻起来像一个肮脏的黑客。