由于TabStop无法在RadioButtons上工作(请参阅链接问题),如何阻止(WinForm)RadioButton被选中,但也允许用户在RadioButton上单击,而不是标签焦点跳到其他地方。
我已阅读this,因此我认为以下内容可行:
rbFMV.Enter += (s, e) => focusFirstWorkflowButton();
rbFMV.MouseUp += (s, e) => rbFMV.Focus();
但事实并非如此。当我点击RB时,焦点会跳开,并且不会在鼠标按下时返回。
那里有任何肮脏的解决方法吗?
答案 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 -
我知道你有,抱歉,错过了:/