private async void ImageCropperPreview_ManipulationCompleted(object sender, Windows.UI.Xaml.Input.ManipulationCompletedRoutedEventArgs e) { await SetSelectedRegionInViewModel(); await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { ImageCropperPreview.Focus(FocusState.Programmatic); }); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private async void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(ViewModel.PreviewFile): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, async() => { await ImageCropperPreview.LoadImageFromFile(ViewModel.PreviewFile); ImageCropperPreview_ManipulationCompleted(ImageCropperPreview, null); }); break; case nameof(ViewModel.SelectedAspectRatioValue): await RunOnUIThreadAsync(CoreDispatcherPriority.High, () => { ImageCropperPreview.AspectRatio = ViewModel.SelectedAspectRatioValue; }); await Task.Delay(500); // ugh... 😞 await SetSelectedRegionInViewModel(); break; case nameof(ViewModel.MinLength): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { ImageCropperPreview.MinCroppedPixelLength = ViewModel.MinLength.Pixels; }); break; case nameof(ViewModel.SelectedX): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { Rect newRect = ImageCropperPreview.CroppedRegion; newRect.X = ViewModel.SelectedX.Pixels; ImageCropperPreview.TrySetCroppedRegion(newRect); }); break; case nameof(ViewModel.SelectedY): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { Rect newRect = ImageCropperPreview.CroppedRegion; newRect.Y = ViewModel.SelectedY.Pixels; ImageCropperPreview.TrySetCroppedRegion(newRect); }); break; case nameof(ViewModel.SelectedWidth): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { Rect newRect = ImageCropperPreview.CroppedRegion; newRect.Width = ViewModel.SelectedWidth.Pixels; newRect.Height = ViewModel.SelectedHeight.Pixels; newRect.X = ViewModel.SelectedX.Pixels; newRect.Y = ViewModel.SelectedY.Pixels; if (ViewModel.IsFixedAspectRatioSelected) { // aspect ratio needs to be *exactly* right, so it sometimes has to be recalculated ImageCropperPreview.AspectRatio = newRect.Width / newRect.Height; } ImageCropperPreview.TrySetCroppedRegion(newRect); }); break; case nameof(ViewModel.SelectedHeight): await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => { Rect newRect = ImageCropperPreview.CroppedRegion; newRect.Width = ViewModel.SelectedWidth.Pixels; newRect.Height = ViewModel.SelectedHeight.Pixels; newRect.X = ViewModel.SelectedX.Pixels; newRect.Y = ViewModel.SelectedY.Pixels; if (ViewModel.IsFixedAspectRatioSelected) { // aspect ratio needs to be *exactly* right, so it sometimes has to be recalculated ImageCropperPreview.AspectRatio = newRect.Width / newRect.Height; } ImageCropperPreview.TrySetCroppedRegion(newRect); }); break; } }