7
7
using Windows . UI . Core ;
8
8
using Microsoft . UI . Xaml ;
9
9
using Microsoft . UI . Xaml . Input ;
10
+ using DirectUI ;
11
+ using Uno . UI . Xaml . Core ;
12
+ using Uno . UI . Xaml . Input ;
10
13
11
14
namespace Private . Infrastructure
12
15
{
@@ -166,7 +169,15 @@ public static async void PressKeySequence(string keys, UIElement element = null)
166
169
var key = keyInstruction . Substring ( 4 , keyInstruction . Length - 4 ) ;
167
170
if ( m_vKeyMapping . TryGetValue ( key , out var vKey ) )
168
171
{
169
- await RaiseOnElementDispatcherAsync ( element , keyDownCodePos == 0 ? UIElement . KeyDownEvent : UIElement . KeyUpEvent , new KeyRoutedEventArgs ( element , vKey , activeModifiers ) ) ;
172
+ var keyArgs = new KeyRoutedEventArgs ( element , vKey , activeModifiers ) ;
173
+
174
+ var previewEvent = keyDownCodePos == 0 ? UIElement . PreviewKeyDownEvent : UIElement . PreviewKeyUpEvent ;
175
+ var mainEvent = keyDownCodePos == 0 ? UIElement . KeyDownEvent : UIElement . KeyUpEvent ;
176
+ await RaiseOnElementDispatcherAsync ( element , previewEvent , keyArgs , true ) ;
177
+ if ( ! keyArgs . Handled )
178
+ {
179
+ await RaiseOnElementDispatcherAsync ( element , mainEvent , keyArgs ) ;
180
+ }
170
181
}
171
182
172
183
// If modifiers were changed, update modifiers variable
@@ -214,22 +225,42 @@ public static async void PressKeySequence(string keys, UIElement element = null)
214
225
{
215
226
if ( m_vKeyMapping . TryGetValue ( "shift" , out var vShiftKey ) )
216
227
{
217
- await RaiseOnElementDispatcherAsync ( element , UIElement . KeyDownEvent , new KeyRoutedEventArgs ( element , vShiftKey , VirtualKeyModifiers . None ) ) ;
228
+ var keyDownArgs = new KeyRoutedEventArgs ( element , vShiftKey , VirtualKeyModifiers . None ) ;
229
+ await RaiseOnElementDispatcherAsync ( element , UIElement . PreviewKeyDownEvent , keyDownArgs ) ;
230
+ if ( ! keyDownArgs . Handled )
231
+ {
232
+ await RaiseOnElementDispatcherAsync ( element , UIElement . KeyDownEvent , keyDownArgs ) ;
233
+ }
218
234
}
219
235
}
220
236
221
237
if ( m_vKeyMapping . TryGetValue ( key , out var vKey ) )
222
238
{
223
239
var modifiers = shouldShift ? VirtualKeyModifiers . Shift : VirtualKeyModifiers . None ;
224
- await RaiseOnElementDispatcherAsync ( element , UIElement . KeyDownEvent , new KeyRoutedEventArgs ( element , vKey , modifiers ) ) ;
225
- await RaiseOnElementDispatcherAsync ( element , UIElement . KeyUpEvent , new KeyRoutedEventArgs ( element , vKey , modifiers ) ) ;
240
+ var keyDownArgs = new KeyRoutedEventArgs ( element , vKey , modifiers ) ;
241
+ await RaiseOnElementDispatcherAsync ( element , UIElement . PreviewKeyDownEvent , keyDownArgs ) ;
242
+ if ( ! keyDownArgs . Handled )
243
+ {
244
+ await RaiseOnElementDispatcherAsync ( element , UIElement . KeyDownEvent , keyDownArgs ) ;
245
+ }
246
+ var keyUpArgs = new KeyRoutedEventArgs ( element , vKey , modifiers ) ;
247
+ await RaiseOnElementDispatcherAsync ( element , UIElement . PreviewKeyDownEvent , keyUpArgs ) ;
248
+ if ( ! keyUpArgs . Handled )
249
+ {
250
+ await RaiseOnElementDispatcherAsync ( element , UIElement . KeyUpEvent , keyUpArgs ) ;
251
+ }
226
252
}
227
253
228
254
if ( shouldShift )
229
255
{
230
256
if ( m_vKeyMapping . TryGetValue ( "shift" , out var vShiftKey ) )
231
257
{
232
- await RaiseOnElementDispatcherAsync ( element , UIElement . KeyUpEvent , new KeyRoutedEventArgs ( element , vShiftKey , VirtualKeyModifiers . None ) ) ;
258
+ var keyUpArgs = new KeyRoutedEventArgs ( element , vShiftKey , VirtualKeyModifiers . None ) ;
259
+ await RaiseOnElementDispatcherAsync ( element , UIElement . PreviewKeyDownEvent , keyUpArgs ) ;
260
+ if ( ! keyUpArgs . Handled )
261
+ {
262
+ await RaiseOnElementDispatcherAsync ( element , UIElement . KeyUpEvent , keyUpArgs ) ;
263
+ }
233
264
}
234
265
}
235
266
}
@@ -239,17 +270,42 @@ public static async void PressKeySequence(string keys, UIElement element = null)
239
270
posEnd = keys . IndexOf ( "#" , posStart ) ;
240
271
}
241
272
242
- async Task RaiseOnElementDispatcherAsync ( UIElement element , RoutedEvent routedEvent , RoutedEventArgs args )
273
+ async Task RaiseOnElementDispatcherAsync ( UIElement element , RoutedEvent routedEvent , KeyRoutedEventArgs args , bool isTunneling = false )
243
274
{
244
275
bool raiseSynchronously = element . Dispatcher . HasThreadAccess ;
245
276
246
- if ( raiseSynchronously )
277
+ // Workaround for not simulating the last input device type correctly yet.
278
+ var inputManager = VisualTree . GetContentRootForElement ( element ) . InputManager ;
279
+ if ( XboxUtility . IsGamepadNavigationInput ( args . OriginalKey ) )
247
280
{
248
- element . SafeRaiseEvent ( routedEvent , args ) ;
281
+ inputManager . LastInputDeviceType = InputDeviceType . GamepadOrRemote ;
249
282
}
250
283
else
251
284
{
252
- await element . Dispatcher . RunAsync ( CoreDispatcherPriority . Normal , ( ) => element . SafeRaiseEvent ( routedEvent , args ) ) ;
285
+ inputManager . LastInputDeviceType = InputDeviceType . Keyboard ;
286
+ }
287
+
288
+ if ( isTunneling )
289
+ {
290
+ if ( raiseSynchronously )
291
+ {
292
+ element . SafeRaiseTunnelingEvent ( routedEvent , args ) ;
293
+ }
294
+ else
295
+ {
296
+ await element . Dispatcher . RunAsync ( CoreDispatcherPriority . Normal , ( ) => element . SafeRaiseTunnelingEvent ( routedEvent , args ) ) ;
297
+ }
298
+ }
299
+ else
300
+ {
301
+ if ( raiseSynchronously )
302
+ {
303
+ element . SafeRaiseEvent ( routedEvent , args ) ;
304
+ }
305
+ else
306
+ {
307
+ await element . Dispatcher . RunAsync ( CoreDispatcherPriority . Normal , ( ) => element . SafeRaiseEvent ( routedEvent , args ) ) ;
308
+ }
253
309
}
254
310
}
255
311
#endif
0 commit comments