Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access key getting selected even we did not press 'Alt' key in WPF

I have WPF application which is having tool bar. In tool bar I have some user controls as tools.

I have set access key to each control, it is working fine.

The issue is: If I click a user control(which is consist of Button and Label, I have set access key for Button) the given task is completed, but when I press any access key without pressing 'Alt' key then it is getting selected.

Any ideas?

like image 310
Syed Avatar asked Dec 09 '11 10:12

Syed


2 Answers

Apparently, this was a deliberate change by Microsoft. See Atanas Koralski's answer here:

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

Menu and ToolBar mnemonics work without pressing Alt key. We decided that we will have uniform behavior in all cases so access key work without pressing Alt key.

I understand that this is not in parity with Forms and we will consider this issue and change the behavior in the next version.

For now as a workaround you can register a class handler for all AccessKeyPressed events and handle the event if Alt key is not pressed.

EventManager.RegisterClassHandler(typeof(UIElement),
AccessKeyManager.AccessKeyPressedEvent,
new AccessKeyPressedEventHandler(OnAccessKeyPressed));

...

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

Also see mfc2wpf's reply:

I've used the above and it works. However, that prevented the default action for Enter and ESC. So I inserted the following at the top of the method.

if (Keyboard.IsKeyDown(Key.Enter) || Keyboard.IsKeyDown(Key.Escape)) return;

Access keys include Enter and Esc, which are the default keys for Buttons which have IsDefault = true or IsCancel = true. If you don't want to require Alt+Enter and Alt+Esc for those buttons, you would need to add the special condition to the handler.

like image 172
nmclean Avatar answered Sep 23 '22 14:09

nmclean


As of .Net 4.5 you can configure this behavior with the CoreCompatibilityPreferences.IsAltKeyRequiredInAccessKeyDefaultScope property. To change the access key behavior so that they will only fire when Alt is pressed set it to true.

CoreCompatibilityPreferences.IsAltKeyRequiredInAccessKeyDefaultScope = true;

As the documentation states this must early in the app. Setting it will throw an exception after it has been read.

like image 33
shf301 Avatar answered Sep 25 '22 14:09

shf301