C# 为什么';我的自定义控件是否接收拖放事件?

C# 为什么';我的自定义控件是否接收拖放事件?,c#,.net,winforms,drag-and-drop,c++-cli,C#,.net,Winforms,Drag And Drop,C++ Cli,我在C++/CLI中编写了一个自定义控件(Forms.control的直接子控件),它将把大部分处理和所有绘制工作卸载到一个单独的遗留ish MFC控件中。我正在将此控件包装到C#应用程序中。我需要能够将项目从应用程序中相同表单上的UserControl拖到C++/CLI控件上 出于某种原因,尽管我将AllowDrop设置为true,但我的自定义控件未接收任何拖放事件。(我已经验证AllowDrop在运行时为true。)我从来没有机会检查/操作DragEventArgs,因为从来没有调用回调 我

我在C++/CLI中编写了一个自定义控件(Forms.control的直接子控件),它将把大部分处理和所有绘制工作卸载到一个单独的遗留ish MFC控件中。我正在将此控件包装到C#应用程序中。我需要能够将项目从应用程序中相同表单上的UserControl拖到C++/CLI控件上

出于某种原因,尽管我将AllowDrop设置为true,但我的自定义控件未接收任何拖放事件。(我已经验证AllowDrop在运行时为true。)我从来没有机会检查/操作DragEventArgs,因为从来没有调用回调

我已经验证了拖放功能是否正常。例如,如果我用一个面板替换自定义控件,我可以很好地得到dragdrop回调

为了支持dragdrop回调,是否必须在控件中实现其他功能?是否有一些微妙的事情必须处理,系统才能识别出一个控件正在悬停,并且应该是dragdrop操作的目标

注意事项:

用于绘制的MFC控件对我来说还不可用,所以我只是绘制一个简单的渐变背景(通过
OnPaintBackground
),我正在尝试绘制它。我还在
OnPaint
中绘制一个较小的渐变矩形

在创建自定义控件的句柄之前(通过设计器/构造函数代码)和创建句柄之后(通过OnHandleCreated override),我都尝试过设置AllowDrop=true。行为上没有区别

拖动光标永远不会从自定义控件上的默认“无可用拖动”光标更改

我正在从UserControl子控件上的
MouseDown
事件的事件处理程序调用
this.DoDragDrop()


DragDrop似乎可以与我在C#中创建的另一个自定义控件一起工作,该控件与用户控件位于同一程序集中。它可以很好地捕获回调。只有我的C++/CLI控件没有看到它们。initializecomponent goo不相关。我可以毫不改变地对它进行评论。

我发现了我的错误,所以我会在这里回答,以防其他人犯类似的错误。看起来我确实在问题中暗示了答案,尽管当时我没有意识到

在我的问题中,我说

我已尝试将AllowDrop设置为true 在自定义控件的 创建句柄(通过 设计师/建造师代码)和之后 句柄被创建(通过 OnHandleCreated覆盖)。不 行为上的差异

这实际上就是故障发生的地方。我没有阅读特别声明我需要记住调用
OnHandleCreated
的基类实现的

反射器显示
控件::OnHandleCreated
负责设置
控件的内部事件通知结构。我从未调用过
Control::OnHandleCreated
,因此内部事件通知结构从未正确构建。此事件结构(反射器再次显示)负责触发
OnDragOver
等,因此缺少事件结构导致我缺少事件

回答:

请确保在重写时调用
OnHandleCreated
的基类实现