WinForm - 不允许选中单选按钮

时间:2011-06-15 20:56:16

标签: c# winforms

由于TabStop无法在RadioButtons上工作(请参阅链接问题),如何阻止(WinForm)RadioButton被选中,但也允许用户在RadioButton上单击,而不是标签焦点跳到其他地方。

我已阅读this,因此我认为以下内容可行:

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

但事实并非如此。当我点击RB时,焦点会跳开,并且不会在鼠标按下时返回。

那里有任何肮脏的解决方法吗?

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

在表单的构造函数中将radiobuttons的TabStop属性设置为“false”。然后将以下事件处理程序附加到radiobuttons的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;
    }

}

您可以使用lambda附加这些事件处理程序,如您在问题中所示。

但重要的是,每当检查/取消选中无线电按钮时,它的tabstop属性也会同时被修改。因此,每次发生事件时都需要将其设置为false。

答案 1 :(得分:1)

底层的Win32 RadioButton不会自动更改TabStop属性。但是,如果使用.NET Reflector,则可以看到.NET控件在调用OnEnter方法时运行代码以更新TabStop属性,因为焦点已进入控件或每次修改AutoCheck或Checked属性时。

幸运的是,您的问题有一个简单的解决方案。只需派生一个覆盖OnTabStopChanged方法的新类,并再次自动将其重新设置为false。这是impl ......

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

          if (TabStop)
            TabStop = false;
      }
  }

然后始终在应用程序中使用NonTabStopRadioButton而不是标准的。

答案 2 :(得分:0)

在我想的时候,只有一个控件可以有输入焦点,因此当他们点击单选按钮时它会获得焦点。 但是如果你这样做会怎么样?

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

另外,你看过TabStop财产了吗?

-edit -

我知道你有,抱歉,错过了:/