Hans Karlsen (talk | contribs) (Created page with "When designing actions you can enter shortcut keys like ctrl-S. These shortcuts are set per action. There has been issues with WPF not listening to these shortcuts - and it s...") |
Hans Karlsen (talk | contribs) No edit summary |
||
Line 4: | Line 4: | ||
The suggested way to deal with the issue is to react to null focus and fix it: | The suggested way to deal with the issue is to react to null focus and fix it: | ||
<pre> | |||
this.IsKeyboardFocusWithinChanged += (s, e) => | this.IsKeyboardFocusWithinChanged += (s, e) => | ||
{ | { | ||
Line 28: | Line 29: | ||
}; | }; | ||
</pre> | |||
Revision as of 14:31, 29 November 2018
When designing actions you can enter shortcut keys like ctrl-S. These shortcuts are set per action.
There has been issues with WPF not listening to these shortcuts - and it seems that main cause of the problem was that the WPF app lost all keyboard focus. It is still no fully clear to me how this can be - but it 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 your WPF window 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);