C# 停止按钮获得点击焦点

问题描述 投票:0回答:3

我有几个按钮,单击它们时我不希望它们获得焦点,也不希望空格键再次“按下”它们。

我想要与 Windows 计算器中的按钮相同的功能。

谷歌搜索和搜索堆栈似乎一切都与表格有关,例如。 在 C# 中使窗体不可聚焦

我知道我应该重写 WndProc,但不完全确定如何继续我应该捕获/忽略哪些消息等。据我所知:

protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
    }
c# winforms button focus
3个回答
25
投票

我今天处理了这个问题,下面是对我来说最简单的答案。我不想使用 this.Focus() 因为我需要焦点保持不变。

http://social.msdn.microsoft.com/Forums/windows/en-US/f1babeac-4bd9-498f-b19b-90b9fed0d751/c-stop-button-from-gaining-focus-on-click

创建自己的无法选择的按钮类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace YourNameSpaceHere {
    class NoSelectButton : Button{

        public NoSelectButton() {

            SetStyle(ControlStyles.Selectable, false);

        }
    }
}

现在,用NoSelectButton而不是系统版本更新设计文件。每个实例应该位于两个位置。

注意:Visual Studio 设计器可能会暂时中断其预览,直到您按“开始”。


7
投票

您所要做的就是将此行添加到按键的

Click
事件的末尾:

this.Focus();

这行代码会导致按钮失去焦点,表单获得焦点,空格键不起作用,从而满足你的2个条件。

现在,如果您不希望再次单击该按钮,请添加以下两行:

this.Focus();
((Button)sender).Enabled = false;

这将执行另一行所做的操作,此外,它将禁用该按钮。


1
投票

正如评论中提到的,我发现最简单的方法是向表单添加一个不执行任何操作(没有事件处理程序)的输入控件,然后在按钮的 OnClick 方法中使用

Control.Focus()
。但是,请注意,如果将虚拟控件的
Visible
属性设置为 false,则此操作将不起作用。

所以我的解决方案是添加一个虚拟按钮,将其大小设置为 0, 0 并将焦点设置为每次。我想您也可以将控件放置在其他东西后面或放置在不可调整大小的表单或面板的边界之外。

© www.soinside.com 2019 - 2024. All rights reserved.