我是否真的必须在自定义控件的OnMouseDown中调用Focus?

Tho*_*mas 9 .net c# focus winforms

我正在实现一个继承自的自定义控件Control.我希望它是可聚焦的(它是一种列表框).

在构造函数中,我这样做

SetStyle(ControlStyles.Selectable, true);
Run Code Online (Sandbox Code Playgroud)

我现在可以使用Tab导航到控件.

但是,当控件收到鼠标单击时,它不会自动声明焦点.当然,我可以解决这个问题:

protected override void OnMouseDown(MouseEventArgs e)
{
    Focus();
    base.OnMouseDown(e);
}
Run Code Online (Sandbox Code Playgroud)

但这感觉就像一个不应该是必需的kludge.这真的是要走的路吗?或者有什么方法可以告诉Control您在收到鼠标点击时自动声明焦点?

Tho*_*mas 4

拆解来救援!事实证明

SetStyle(ControlStyles.UserMouse, true);
Run Code Online (Sandbox Code Playgroud)

就可以了。

具有讽刺意味的是,我在文档中读到:

UserMouse:如果为 true,则控件将进行自己的鼠标处理,并且鼠标事件不由操作系统处理。

这似乎与我想要的完全相反,所以我只尝试将其设置为false...干得好,WinForms 文档。

  • 这是不正确的。关闭 UserMouse 样式只能针对实现自己的鼠标消息处理的本机控件的 Control 类包装器。您允许控件获得焦点,因为您对输入事件感兴趣。故意关闭输入事件处理是没有意义的。 (2认同)