WinForm - не разрешать вкладку переключателя в - PullRequest
2 голосов
/ 16 июня 2011

Поскольку TabStop не работает с RadioButton (см. Связанный вопрос), как я могу предотвратить вкладку RadioButton (WinForm), а также позволить пользователю щелкнуть на RadioButton без вкладкиФокус прыжок в другом месте.

Я прочитал это , и поэтому я подумал, что будет работать следующее:

        rbFMV.Enter += (s, e) => focusFirstWorkflowButton();
        rbFMV.MouseUp += (s, e) => rbFMV.Focus();

Но это не так.Когда я нажимаю на RB, фокус исчезает и не возвращается на Mouse Up.

Есть какие-нибудь грязные обходные пути?

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Попробуйте что-то вроде этого:

Установите свойство TabStop для радиокнопок на «false» в конструкторе формы.Затем присоедините следующие обработчики событий к событиям CheckedChanged радиокнопок.

public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();
        radioButton1.TabStop = false;
        radioButton2.TabStop = false;
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        radioButton1.TabStop = false;
        radioButton2.TabStop = false;
    }

    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
        radioButton1.TabStop = false;
        radioButton2.TabStop = false;
    }

}

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

Но важноДело в том, что всякий раз, когда переключатель отмечен / не отмечен, его свойство tabstop также изменяется одновременно.Следовательно, вам нужно устанавливать значение false каждый раз, когда происходит это событие.

1 голос
/ 16 июня 2011

Базовый RadioButton Win32 не изменяет автоматически свойство TabStop.Однако, если вы используете .NET Reflector, вы увидите, что элемент управления .NET запускает код для обновления свойства TabStop при каждом вызове метода OnEnter, поскольку фокус входит в элемент управления или когда изменяются свойства AutoCheck или Checked.

К счастью, есть простое решение вашей проблемы.Просто создайте новый класс, который переопределяет метод OnTabStopChanged, и автоматически снова установите для него значение false.Вот что значит ...

  public class NonTabStopRadioButton : RadioButton
  {
      protected override void OnTabStopChanged(EventArgs e)
      {
          base.OnTabStopChanged(e);

          if (TabStop)
            TabStop = false;
      }
  }

Тогда всегда используйте NonTabStopRadioButton в вашем приложении вместо стандартного.

0 голосов
/ 16 июня 2011

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

rbFMV.GotFocus += (s, e) => someothercontrol.Focus();

также, вы смотрели на свойство TabStop ?

-edit-

Я вижу, вы, извините, пропустили это: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...