为什么只有在按下Tab键后才显示焦点矩形?

5
我有一个奇怪的问题(可能只有我才能理解),为什么在测试应用程序中,焦点矩形框不显示,直到我按下tab键。
我想显示一个对话框,其中包含两个单选框和两个按钮。当我显示对话框时,我希望看到我的第一个单选按钮周围有一个焦点矩形框。(这样用户就可以看到焦点在哪里。)我对控件进行了排序,并将tabindex属性从0设置为4,以便它们按正确顺序排列。(单选框1的tabindex为0,...)
当我显示对话框时,第一个单选框具有焦点,但它周围没有焦点矩形框。(直到我按tab键。)
我创建了一个完全空白的winforms项目(Visual Studio 2010),添加了控件并启动了它。所以根本没有什么特别的。
有人能给我一个提示我在做错了什么吗?
抱歉,这是我的示例代码:
Public Class Form1

Private Sub Button1_Click(sender As System.Object, _
  e As System.EventArgs) _
    Handles Button1.Click

    Me.Close()
End Sub

Private Sub Button2_Click(sender As System.Object, _
  e As System.EventArgs) _
    Handles Button2.Click

    Me.Close()
End Sub

Private Sub Form1_Shown(sender As Object, _
   e As System.EventArgs) _
  Handles Me.Shown

    RadioButton1.Focus()
    RadioButton1.Select()
    SendKeys.SendWait("{TAB}")
    SendKeys.SendWait("+{TAB}")

End Sub

End Class

啊嗯...我忘了说,我正在使用Windows 7(64位)操作系统。 - AlexS
难以修复的错误,我尝试过的所有方法都没有奏效。 - Hans Passant
我进行了更多的研究,发现向表单发送“Tab”键会调用Control.ChangeUICues事件,在该事件中将标志UICuesEventArgs.ShowFocus设置为true。 (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.changeuicues.aspx) 在处理完此事件后,焦点矩形可见。有人知道如何直接触发/调用此事件吗?我没有找到任何可以将其设置为true的属性... - AlexS
你真的不能/不应该这样做,因为它是一个系统设置。在旧的XP系统中,转到控制面板-显示-外观-效果,有一个“隐藏键盘导航下划线,直到我按Alt键”选项。当取消选择时,对话框中的单选按钮会出现你想要的情况。我不知道Win 7中该设置在哪里。但基本上,这是用户的偏好设置。 - LarsTech
很高兴知道这是用户设置。谢谢你说出来。 - AlexS
有趣的是它与该设置相关联,因为该设置的文本并未涵盖焦点矩形。 - Martin Brown
5个回答

5

正如我所评论的,这确实是用户偏好设置。

但是要显示矩形,请继承您自己的RadioButton并覆盖ShowFocusCues函数:

Public Class RadioWithFocus
  Inherits RadioButton

  Protected Overrides ReadOnly Property ShowFocusCues() As Boolean
    Get
      Return True
    End Get
  End Property

End Class

2
马丁·康奈尔:你的解决方案对我有用!谢谢。
同样适用于C#:
  using System.Runtime.InteropServices;
  ...
  [DllImport("USER32")]
  private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wp, int lp);
  private const int WM_CHANGEUISTATE = 0x0127; // from WinUser.h
  private const int UIS_CLEAR = 2;
  private const int UISF_HIDEFOCUS = 0x1;
  private const int UISF_HIDEACCEL = 0x2;

  ...

  SendMessage(Handle, WM_CHANGEUISTATE, UIS_CLEAR | ((UISF_HIDEACCEL | UISF_HIDEFOCUS) << 16), 0);

2
对于Win32/C++,向父窗口发送WM_CHANGEUISTATE消息:
    // Enable focus rect and accelerator underline in all controls.
    ::SendMessage(WM_CHANGEUISTATE, MAKELONG(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);

1
在您的表单的初始化方法或适用位置中使用继承的 Control.Focus()。例如:
public Form1 () {
    //Other stuff here
    radiobox1.Focus();// If this is the name of your control
}

另一种方法是查看Form.Activate。在这种情况下,这可能更好。

此外,ActiveControl可能会有所帮助。


我知道 .Focus 方法,首先尝试了它。你的 .Activate 方法是个好主意,但都没有起作用。 :-/ - AlexS

0
如LarsTech所说,这是一个用户设置。对于Windows 7,您可以在以下位置找到此设置: 打开控制面板/便捷访问中心/使键盘更易于使用。
查找带有文本“下划线键盘快捷方式和访问键”的复选框并选中它。
重新运行您的应用程序,您将看到焦点提示现在会在您的表单首次加载时显示出来。
享受吧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接