private async void WindowLoaded(object sender, RoutedEventArgs e) { // Step 1: Connect to Microsoft Gestures service _gesturesService = GesturesServiceEndpointFactory.Create(); _gesturesService.StatusChanged += (s, arg) => Dispatcher.Invoke(() => GesturesServiceStatus.Text = $"[{arg.Status}]"); Closed += (s, arg) => _gesturesService?.Dispose(); await _gesturesService.ConnectAsync(); // Step 2: Define your custom gesture // Start with defining the first pose, ... var hold = new HandPose("Hold", new FingerPose(new[] { Finger.Thumb, Finger.Index }, FingerFlexion.Open, PoseDirection.Forward), new FingertipDistanceRelation(Finger.Index, RelativeDistance.NotTouching, Finger.Thumb), new FingertipPlacementRelation(Finger.Index, RelativePlacement.Above, Finger.Thumb)); // ... define the second pose, ... var rotate = new HandPose("Rotate", new FingerPose(new[] { Finger.Thumb, Finger.Index }, FingerFlexion.Open, PoseDirection.Forward), new FingertipDistanceRelation(Finger.Index, RelativeDistance.NotTouching, Finger.Thumb), new FingertipPlacementRelation(Finger.Index, RelativePlacement.Right, Finger.Thumb)); // ... finally define the gesture using the hand pose objects defined above forming a simple state machine: hold -> rotate _rotateGesture = new Gesture("RotateRight", hold, rotate); _rotateGesture.Triggered += (s, args) => Dispatcher.Invoke(() => Arrow.RenderTransform = new RotateTransform(++_rotateTimes * 90, Arrow.ActualWidth / 2, Arrow.ActualHeight / 2)); // Step 3: Register the gesture (When window focus is lost (gained) the service will automatically unregister (register) the gesture) // To manually control the gesture registration, pass 'isGlobal: true' parameter in the function call below await _gesturesService.RegisterGesture(_rotateGesture); }
private async void WindowLoaded(object sender, RoutedEventArgs e) { // Step 1: Connect to Microsoft Gestures service _gesturesService = GesturesServiceEndpointFactory.Create(); _gesturesService.StatusChanged += (s, args) => Dispatcher.Invoke(() => GeturesServiceStatus.Text = $"[{args.Status}]"); Closed += (s, args) => _gesturesService?.Dispose(); await _gesturesService.ConnectAsync(); // Step 2: Define the RewindGesture gesture as follows: // ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ // │ │ │ │ │ │ │ │ │ │ │ │ │ │ // │ Idle │ -> │ Spread │ -> │ Pause │ -> │ Rewind │ -> │KeepRewind│ -> │ Release │ -> │ Idle │ // │ │ │(unpinch) │ │ (pinch) │ │ (left) │ │ (pinch) │ │(unpinch) │ │ │ // └──────────┘ └──────────┘ └────┬─────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ // │ ^ // └───────────────────────────────────────────────┘ // // Whenever the gesture returns to the Idle state, playback will resume // var spreadPose = GeneratePinchPose("Spread", true); var pausePose = GeneratePinchPose("Pause"); pausePose.Triggered += (s, args) => Dispatcher.Invoke(() => VideoStatus.Text = "⏸"); var rewindMotion = new HandMotion("Rewind", new PalmMotion(VerticalMotionSegment.Left)); rewindMotion.Triggered += (s, args) => Dispatcher.Invoke(() => VideoStatus.Text = "⏪"); var keepRewindingPose = GeneratePinchPose("KeepRewind"); var releasePose = GeneratePinchPose("Release", true); // Then define the gesture by concatenating the previous objects to form a simple state machine _rewindGesture = new Gesture("RewindGesture", spreadPose, pausePose, rewindMotion, keepRewindingPose, releasePose); // Detect if the user releases the pinch-grab hold in order to resume the playback _rewindGesture.AddSubPath(pausePose, releasePose); // Continue playing the video when the gesture resets (either successful or aborted) _rewindGesture.Triggered += (s, args) => Dispatcher.Invoke(() => VideoStatus.Text = "▶"); _rewindGesture.IdleTriggered += (s, args) => Dispatcher.Invoke(() => VideoStatus.Text = "▶"); // Step 3: Register the gesture (When window focus is lost (gained) the service will automatically unregister (register) the gesture) // To manually control the gesture registration, pass 'isGlobal: true' parameter in the function call below await _gesturesService.RegisterGesture(_rewindGesture); }
public void Dispose() => _gesturesService?.Dispose();
public MainWindow() { InitializeComponent(); Loaded += WindowLoaded; Closed += (s, args) => _gesturesService.Dispose(); }
private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { _gesturesService?.Dispose(); }