即使我们没有在 WPF 中按下“Alt”键,访问键也被选中

Sye*_*yed 5 wpf wpf-controls access-keys

我有带有工具栏的 WPF 应用程序。在工具栏中,我有一些用户控件作为工具。

我已经为每个控件设置了访问密钥,它工作正常。

问题是:如果我点击一个用户控件(它由按钮和标签组成,我已经为按钮设置了访问键),给定的任务就完成了,但是当我按下任何访问键而不按“Alt”键时,它就会得到被选中。

有任何想法吗?

nmc*_*ean 4

显然,这是微软故意的改变。请参阅 Atanas Koralski 的回答:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/14f6f49f-0027-471b-b68c-e7f6ba012012

菜单和工具栏助记符无需按 Alt 键即可使用。我们决定在所有情况下都具有统一的行为,因此无需按 Alt 键即可访问关键工作。

我知道这与 Forms 不一样,我们将考虑这个问题并在下一版本中更改行为。

目前,作为一种解决方法,您可以为所有 AccessKeyPressed 事件注册一个类处理程序,并在未按下 Alt 键时处理该事件。

EventManager.RegisterClassHandler(typeof(UIElement),
AccessKeyManager.AccessKeyPressedEvent,
new AccessKeyPressedEventHandler(OnAccessKeyPressed));
Run Code Online (Sandbox Code Playgroud)

...

private static void OnAccessKeyPressed(object sender, AccessKeyPressedEventArgs e)
{
    if (!e.Handled && e.Scope == null && (e.Target == null || e.Target == label))
    {
        // If Alt key is not pressed - handle the event
        if ((Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt)
        {
            e.Target = null;
            e.Handled = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅 mfc2wpf 的回复:

我已经使用了上面的方法并且有效。但是,这阻止了 Enter 和 ESC 的默认操作。所以我在方法的顶部插入了以下内容。

if (Keyboard.IsKeyDown(Key.Enter) || Keyboard.IsKeyDown(Key.Escape)) return;
Run Code Online (Sandbox Code Playgroud)

访问键包括Enter和,它们是具有或 的sEsc的默认键。如果您不想为这些按钮添加+和+ ,则需要将特殊条件添加到处理程序中。ButtonIsDefault = trueIsCancel = trueAltEnterAltEsc