WurmInfinity Ответов: 6

Установка кнопки в положение Focusable = false


Поскольку я не получил ответа на этот вопрос на свой предыдущий вопрос, Может ли кто-нибудь сказать мне, как установить фокус кнопок на false в Visual studio с помощью C#.
Спасибо

lw@zi

Не могли бы вы добавить это в качестве дополнения к вашему первоначальному вопросу? Кроме того, вы проверили мой ответ?

WurmInfinity

дело сделано :)

Nuri Ismail

Похоже, что проще восстановить обратно сфокусированный текстовый блок, положение курсора в нем и выбранную длину текста в нем, чем препятствовать кнопкам получить фокус (по крайней мере, в WinForms). Пожалуйста, ознакомьтесь с моим обновленным ответом на ваш первоначальный вопрос.

6 Ответов

Рейтинг:
13

Tarun.K.S

Вы можете сделать это :

Кнопка 1.Фокусируемый=Ложь


Ashish Tyagi 40

Focusable-это друг свойства только для чтения...

Tarun.K.S

Public Property Focusable() As Boolean
члены системы.Окна.UIElement
Резюме:
Возвращает или задает значение, указывающее, может ли элемент получить фокус. Это свойство зависимости.

значение:
true, если элемент является фокусируемым; в противном случае false. Значение по умолчанию равно false, но см. Примечания.

Ну вот что говорит Visual Studio!

Sergey Alexandrovich Kryukov

Это не то, о чем спрашивал исследователь (по крайней мере формально), проблема была неправильным представлением-см. мой ответ.

Tarun.K.S

Ну, спрашивающий попросил установить фокус кнопки на false, и это то, что я сделал.
Из вашего ответа я не согласен с этим: "невозможно "снять" фокус, можно только переместить фокус куда-то еще". Вполне возможно, я уже пробовал, что вы не сможете щелкнуть мышью и не будете иметь фокуса клавиатуры, как только установите focusable в false.

Nish Nishant

Ух ты, помечено в качестве ответа и все-таки проголосовала за 1. Странно!

Tarun.K.S

Да, это довольно странно! и все равно никто не сможет ему противостоять :(

Рейтинг:
1

R. Giskard Reventlov

Установите TabStop собственность на false Или вы хотите сделать кнопку полностью недоступной, но видимой? Набор Enabled к false Оба они могут быть установлены в коде.


WurmInfinity

Нет, я хочу, чтобы фокус-дозатор ушел из текстового поля. TapStop все еще тянет фокус, когда кнопка нажата. Есть еще идеи?

R. Giskard Reventlov

Почему бы не установить фокус обратно на текстовое поле в событии onclick (либо javascript, либо код позади, если это необходимо)?

Sergey Alexandrovich Kryukov

Это не то, о чем спрашивал исследователь (по крайней мере формально), проблема была неправильным представлением-см. мой ответ.

R. Giskard Reventlov

Вы пытаетесь быть слишком умным и, таким образом, полностью упускаете суть. Его не волнует ни семантика, ни "почему", ни "почему", ни то, что это "неопределенное действие", он просто хочет его совершить.

Рейтинг:
1

Sergey Alexandrovich Kryukov

Я думаю, что это будет окончательный ответ:

Вопрос не правильный, потому что в нем нет никакого смысла.
Нахождение в фокусе не является исключительным свойством элемента управления, это, по сути, свойство, если набор элементов управления.

Прежде всего, по существу, фокус-это цель диспетчеризации события клавиатуры; в каком управлении идут события. Кроме того, должна быть визуальная подсказка для этого состояния (реализация этой визуальной подсказки в элементе управления может быть легко провалена в случае неаккуратного программирования).

Общее расфокусирование контроля не возможно или невозможно, это неопределенное действие. Невозможно "убрать" фокус, можно только переместить фокус куда-то еще. Кроме того, запрос на удаление фокуса из конкретного элемента управления не имеет практического смысла.

Когда вы хотите, чтобы ваши глаза убрали фокус с объекта, на который вы смотрите, вы обычно осознаете это, как фокусируетесь на чем-то другом, или же вы можете закрыть глаза.

Now, here is more on background: there are also windows or forms. They are not focused, they are activated or deactivated. Among windows, "activity" status plays the role of the focus within a window. When a windows is activated, one of its controls gets focus. When it is deactivated, nothing on it is in focus, but on next activation, the same very control will get in focus. Within the window, the focus can be moved from control to control. So we can talk about "logical" and "physical" focus of a control (on WPF, whole hierarchy of logical focus is supported, on WinForms we can talk only about one control). "Logical" focus does not depend on the activation status of the form, but "physical" does -- a control is in focus (can physically accept keyboard events) only when it is in a "logical" focus and the window is activated.


Sergey Alexandrovich Kryukov

Ха-ха! Избиратели! Сладкая парочка. Твой учитель не сказал "Молодец, милая", как раньше?

R. Giskard Reventlov

Полная чушь.

Sergey Alexandrovich Kryukov

Кто-то хотел доказать, что это не пара. Это так забавно.

Tarun.K.S

Ты так ошибаешься!

Sergey Alexandrovich Kryukov

Возможно, вы не понимаете. Пожалуйста, объясните это.

Рейтинг:
1

Anupama Roy

Попробуйте ActiveControl свойство формы

this.activecontrol = textbox1;


Рейтинг:
0

dmreference

class ButtonNoFocus : Button
{
    protected override void WndProc(ref Message m)
    {
        const int WM_MOUSEACTIVATE = 0x0021;
        const int MA_NOACTIVATEANDEAT = 4;

        if (m.Msg == WM_MOUSEACTIVATE)
        {
            m.Result = new IntPtr(MA_NOACTIVATEANDEAT);
            DoMouseDown(new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
        }
        else
            base.WndProc(ref m);
    }

    public new event MouseEventHandler MouseDown;

    private void DoMouseDown(MouseEventArgs mouseEventArgs)
    {
        var e = MouseDown;
        if (e != null)
            MouseDown(this, mouseEventArgs);
    }
}


Это предотвратит фокусировку и вызовет поддельное событие MouseDown при нажатии. Примечание: событие щелчка не будет срабатывать, так как элемент управления должен взять фокус для щелчка, чтобы произойти; однако, если вы хотите захватить мышь и вручную отслеживать это должно работать.

UPD: лучше вернуть MA_NOACTIVATE (3), так как это не приведет к фокусировке на элементе управления, но все равно вызовет обычное событие MouseDown.


Рейтинг:
0

lw@zi

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


Sergey Alexandrovich Kryukov

Нет никакого способа, но не потому, что это просто невозможно, потому что само понятие не имеет смысла, проблема была неправильным представлением-см. Мой ответ.