有没有办法让没有Alt键的热键显示_?

时间:2012-05-10 23:14:37

标签: c# .net wpf hotkeys

在WPF中制作如下标签:

<Label Content="_My Label"/>

然后当您运行应用程序并按 Alt 键时,它将显示带有下划线的“M”。

我们有自己的自定义热键附加属性,允许我们使用 Ctrl 以及 Alt

问题是只有 Alt 会显示下划线。

当按下 Ctrl 键时,有没有办法显示下划线?

注意:当按下 Ctrl 时,我不想在后台发送程序化的 Alt KeyPress。这只会混淆我的快捷方式系统。

1 个答案:

答案 0 :(得分:1)

确定!我有一个解决方案,在没有按 Alt 但按 Ctrl 的情况下显示_热键。

以下是如何做到这一点:


动态按键盘键的小代码:

//<summary>
//Function to Perform a Keyboard KeyPress.
//</summary>
void PressKey(Key KeyboardKey)
{
    KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice,
    Keyboard.PrimaryDevice.ActiveSource, 0, Key.LeftAlt);
    args.RoutedEvent = Keyboard.KeyDownEvent;
    InputManager.Current.ProcessInput(args);
}

要添加和删除的代码HotKeyChar

//<summary>
//Function to Append a HotKeyChar to a Content of a Control.
//</summary>
void AppendHotKeyChar(ContentControl Ctrl, int KeyIndex)
{
    if (Ctrl.Content.ToString().Substring(KeyIndex, 1) != "_")
    {
        Ctrl.Content = "_" + Ctrl.Content;
    }
}
//<summary>
//Function to Remove a HotKeyChar to a Content of a Control.
//</summary>
void RemoveHotKeyChar(ContentControl Ctrl, int KeyIndex)
{
    if (Ctrl.Content.ToString().Substring(KeyIndex, 1) == "_")
    {
        Ctrl.Content = Ctrl.Content.ToString().Remove(KeyIndex, 1);
    }
}

Button Bt1的XAML代码:

<Button x:Name="Bt1" Content="Button" HorizontalAlignment="Left" Margin="169,97,0,0" VerticalAlignment="Top" Width="75"/>

Window.Loaded MainWindow事件的代码(例如MainWindow1_Loaded):

PressKey(Key.LeftAlt);

Window.KeyDown MainWindow事件的代码(例如MainWindow1_KeyDown):

if (e.Key == Key.LeftCtrl)
{
    AppendHotKey(Bt1, 0);
}

Window.KeyUp MainWindow事件的代码(例如MainWindow1_KeyUp):

if (e.Key == Key.LeftCtrl)
{
    RemoveHotKey(Bt1, 0);
}

现在,当您启动应用程序时, Alt 将动态按下一次。

现在,每次按 Ctrl ,您的Control.Content都会附加_,因此HotKey会显示下划线! 但有一点需要注意的是,您应该创建Control.Content而不是HotKeyChar '_',但要保留Index附加_的位置。

但请记住,如果在您的应用中再次按 Alt ,代码将不再有效。因此,您必须再次按 Alt 才能使代码正常工作!

添加和删除HotKeyChar的最佳方式:

  • 创建List<KeyValuePair<int, Control>>的实例,以存储IndexHotKeyChar的{​​{1}}。
  • 现在在Control活动中,只需循环KeyDown中的KeyValuePair<...> ..附加List<...>
  • 再次在_事件中,循环浏览KeyUp中的KeyValuePair<...> ..删除List<...>

希望有所帮助!