7

在 WPF 中,当您制作这样的标签时:

<Label Content="_My Label"/>

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

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

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

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

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

4

1 回答 1

1

行!我有一个解决方案可以在不按下但按下_的情况下显示热键。AltCtrl

这是如何做到的:


动态按下键盘键的小代码:

//<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);
    }
}

XAML 代码Button Bt1

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

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

PressKey(Key.LeftAlt);

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

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

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

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

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

现在每次你按Ctrl,你的Control.Content遗嘱都会附加一个_,所以HotKey会出现下划线!但要注意的是,您应该Control.Content在不添加HotKeyChar '_'但保留Index_将附加的位置的情况下创建。

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

添加和删​​除 a 的最佳方法HotKeyChar

  • 创建一个实例List<KeyValuePair<int, Control>>来存储IndexHotKeyCharControl
  • 现在在KeyDown事件中只需循环KeyValuePair<...>..List<...>附加_.
  • 在这种情况KeyUp下,只需遍历..removing 中KeyValuePair<...>的.List<...>_

希望对您有所帮助!

于 2012-05-22T08:59:36.443 回答