Кнопка Стоп C # от Фокуса на Щелчке - PullRequest
4 голосов
/ 19 июля 2011

У меня есть несколько кнопок, при нажатии которых я не хочу, чтобы они получали фокус, и при этом я не хочу, чтобы клавиша пробела «нажимала» их снова.

Мне нужна та же функциональность, что и у кнопок в калькуляторе Windows.

Гуглил и искал в стеке все вроде бы про формы например. Сделать форму не фокусируемой в C #

Я знаю, что должен переписать WndProc, но не совсем уверен, как поступить, какие сообщения я должен перехватывать / игнорировать и т. Д. Насколько яполучил:

protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
    }

Ответы [ 3 ]

15 голосов
/ 28 июня 2013

Я имел дело с этой проблемой сегодня, и ниже приведен самый простой для меня ответ. Я не хотел использовать это. 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 может на мгновение прервать предварительный просмотр, пока вы не нажмете Пуск.

6 голосов
/ 19 июля 2011

Все, что вам нужно сделать, это добавить эту строку в конец события Click клавиши:

this.Focus();

Эта строка приведет к тому, что кнопка потеряет фокус, форма получит фокус, а пробелне имеют никакого эффекта, таким образом, удовлетворяя вашим 2 условиям.

Теперь, если вы не хотите, чтобы кнопка снова могла быть нажата, добавьте вместо этого следующие 2 строки:

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

Thisбудет делать то же, что и другая строка, и, кроме того, она отключит кнопку.

1 голос
/ 25 февраля 2015

Как уже упоминалось в комментариях, я считаю, что самый простой способ сделать это - добавить элемент управления вводом в форму, который ничего не делает (не имеет обработчиков событий), а затем в методе OnClick кнопки использовать Control.Focus().Однако обратите внимание, что это не сработает, если вы установите для свойства Visible элемента управления dummy значение false.

Поэтому мое решение заключалось в добавлении фиктивной кнопки, установке ее размера на 0, 0 и установке фокусак этому каждый раз.Я полагаю, вы также можете поместить элемент управления за чем-то другим или за пределы неизменяемой формы или панели.

...