🚀 Welcome to MDriven Learn –  Don’t miss the latest Release Notes.
Use WPF Menu Shortcut Keys

When designing actions, you can enter shortcut keys like ctrl-S. These shortcuts are set per action.

See also: Turnkey clients (AngularJS and Blazor) offer standard shortcut-keys

There have been issues with WPF not listening to these shortcuts; it seems that the main cause of the problem was that the WPF app lost all keyboard focus. It is still not fully clear to me how this can be—but it is easy to see when it happens.

The suggested way to deal with the issue is to react to null focus and fix it:

      this.IsKeyboardFocusWithinChanged += (s, e) =>
      {
        if (!this.IsActive)
          return;
        var foc = Keyboard.FocusedElement;
        if (foc == null)
        {
          Trace.WriteLine("IsKeyboardFocusedChanged NOTHING");
          RescueNullFocus();
        }
        else
          Trace.WriteLine("IsKeyboardFocusedChanged " + foc.GetType().Name);

      };

This calls the RescueNullFocus method, and you can define it like this:

    private void RescueNullFocus()
    {
      new DisplayQueueThis(() =>
      {
        if (Keyboard.FocusedElement == null && this.IsActive)  // if the keyboard focused is lost - return it to something usefull
        {
          IInputElement x = null;
          if (_wecpof.CurrentWindow() != null)
            x = (_wecpof.CurrentWindow() as FrameworkElement).PredictFocus(FocusNavigationDirection.Right) as IInputElement;
          if (x == null)
            x = (_wecpof).PredictFocus(FocusNavigationDirection.Right) as IInputElement;
          if (x != null) // Got stuck on Menu
          {
            if (!(x is MenuItem))
              Keyboard.Focus(x);
            else
            {
              // find a non menuitem
              var next = x as FrameworkElement;
              var stop = next;
              while (next != stop && next != null && !(next is MenuItem))
                next = next.PredictFocus(FocusNavigationDirection.Right) as FrameworkElement;
              if (next != null)
                Keyboard.Focus(x);
            }

          }

        }
      });
    }

It is also a good idea to call RescueNullFocus at the start of the application.

A change was also introduced to the WPF window to own the InputBindings instead of the WECPOF. This is done with an extra parameter to _wecpof.EasyInit like this:

_wecpof.EasyInit(_ecospace, false, pathToStyles, thestyle, this/*send in window as command target*/, _targetgroup);