From 4975258861b21eed26de280d19008de73330f2b0 Mon Sep 17 00:00:00 2001 From: hhchaos Date: Sun, 22 Mar 2020 17:31:31 +0800 Subject: [PATCH 1/3] Add CroppedRegionChanged event for ImageCropper. --- .../ImageCropper/ImageCropper.Events.cs | 7 +++-- .../ImageCropper/ImageCropper.Logic.cs | 13 +++++---- .../ImageCropper/ImageCropper.Properties.cs | 27 +++++++++++++++---- .../ImageCropper/ImageCropper.cs | 13 +++++---- ...ageCropperCroppedRegionChangedEventArgs.cs | 24 +++++++++++++++++ 5 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs index 1f47e0f822b..ee64cfb5910 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs @@ -7,7 +7,6 @@ using Windows.System; using Windows.UI.Core; using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Input; namespace Microsoft.Toolkit.Uwp.UI.Controls @@ -104,7 +103,7 @@ private void ImageCropperThumb_KeyUp(object sender, KeyRoutedEventArgs e) if (croppedRect.Width > MinCropSize.Width && croppedRect.Height > MinCropSize.Height) { croppedRect.Intersect(_restrictedCropRect); - _currentCroppedRect = croppedRect; + CroppedRegion = croppedRect; } UpdateImageLayout(true); @@ -117,7 +116,7 @@ private void ImageCropperThumb_ManipulationCompleted(object sender, Manipulation if (croppedRect.Width > MinCropSize.Width && croppedRect.Height > MinCropSize.Height) { croppedRect.Intersect(_restrictedCropRect); - _currentCroppedRect = croppedRect; + CroppedRegion = croppedRect; } UpdateImageLayout(true); @@ -161,7 +160,7 @@ private void SourceImage_ManipulationDelta(object sender, ManipulationDeltaRoute selectedRect.Y += offsetY; var croppedRect = _inverseImageTransform.TransformBounds(selectedRect); croppedRect.Intersect(_restrictedCropRect); - _currentCroppedRect = croppedRect; + CroppedRegion = croppedRect; UpdateImageLayout(); } diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs index 5f6a023ef46..e4006ceb5ec 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs @@ -6,7 +6,6 @@ using System.Numerics; using Windows.Foundation; using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Media.Animation; @@ -29,7 +28,7 @@ private void InitImageLayout(bool animate = false) _restrictedCropRect = new Rect(0, 0, Source.PixelWidth, Source.PixelHeight); if (IsValidRect(_restrictedCropRect)) { - _currentCroppedRect = KeepAspectRatio ? GetUniformRect(_restrictedCropRect, UsedAspectRatio) : _restrictedCropRect; + CroppedRegion = KeepAspectRatio ? GetUniformRect(_restrictedCropRect, UsedAspectRatio) : _restrictedCropRect; UpdateImageLayout(animate); } } @@ -45,8 +44,8 @@ private void UpdateImageLayout(bool animate = false) { if (Source != null && IsValidRect(CanvasRect)) { - var uniformSelectedRect = GetUniformRect(CanvasRect, _currentCroppedRect.Width / _currentCroppedRect.Height); - UpdateImageLayoutWithViewport(uniformSelectedRect, _currentCroppedRect, animate); + var uniformSelectedRect = GetUniformRect(CanvasRect, CroppedRegion.Width / CroppedRegion.Height); + UpdateImageLayoutWithViewport(uniformSelectedRect, CroppedRegion, animate); } } @@ -70,7 +69,7 @@ private void UpdateImageLayoutWithViewport(Rect viewport, Rect viewportImageRect _inverseImageTransform.ScaleX = _inverseImageTransform.ScaleY = 1 / imageScale; _inverseImageTransform.TranslateX = -_imageTransform.TranslateX / imageScale; _inverseImageTransform.TranslateY = -_imageTransform.TranslateY / imageScale; - var selectedRect = _imageTransform.TransformBounds(_currentCroppedRect); + var selectedRect = _imageTransform.TransformBounds(CroppedRegion); _restrictedSelectRect = _imageTransform.TransformBounds(_restrictedCropRect); var startPoint = GetSafePoint(_restrictedSelectRect, new Point(selectedRect.X, selectedRect.Y)); var endPoint = GetSafePoint(_restrictedSelectRect, new Point( @@ -272,7 +271,7 @@ private void UpdateCroppedRect(ThumbPosition position, Point diffPos) var croppedRect = _inverseImageTransform.TransformBounds( new Rect(startPoint, endPoint)); croppedRect.Intersect(_restrictedCropRect); - _currentCroppedRect = croppedRect; + CroppedRegion = croppedRect; var viewportRect = GetUniformRect(CanvasRect, selectedRect.Width / selectedRect.Height); var viewportImgRect = _inverseImageTransform.TransformBounds(selectedRect); UpdateImageLayoutWithViewport(viewportRect, viewportImgRect); @@ -558,7 +557,7 @@ private void UpdateAspectRatio(bool animate = false) var croppedRect = _inverseImageTransform.TransformBounds(uniformSelectedRect); croppedRect.Intersect(_restrictedCropRect); - _currentCroppedRect = croppedRect; + CroppedRegion = croppedRect; UpdateImageLayout(animate); } } diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Properties.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Properties.cs index f0640486f23..304afe940bc 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Properties.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Properties.cs @@ -25,11 +25,6 @@ public partial class ImageCropper /// public double MinSelectedLength { get; set; } = 40; - /// - /// Gets the current cropped region. - /// - public Rect CroppedRegion => _currentCroppedRect; - private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var target = (ImageCropper)d; @@ -64,6 +59,13 @@ private static void OnCropShapeChanged( target.UpdateMaskArea(); } + private static void OnCroppedRegionChanged( + DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var target = (ImageCropper)d; + target.CroppedRegionChanged?.Invoke(target, new ImageCropperCroppedRegionChangedEventArgs { OldRegion = (Rect)e.OldValue, NewRegion = (Rect)e.NewValue }); + } + private static void OnThumbPlacementChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -99,6 +101,15 @@ public CropShape CropShape set { SetValue(CropShapeProperty, value); } } + /// + /// Gets the current cropped region. + /// + public Rect CroppedRegion + { + get { return (Rect)GetValue(CroppedRegionProperty); } + private set { SetValue(CroppedRegionProperty, value); } + } + /// /// Gets or sets the mask on the cropped image. /// @@ -153,6 +164,12 @@ public ThumbPlacement ThumbPlacement public static readonly DependencyProperty CropShapeProperty = DependencyProperty.Register(nameof(CropShape), typeof(CropShape), typeof(ImageCropper), new PropertyMetadata(default(CropShape), OnCropShapeChanged)); + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty CroppedRegionProperty = + DependencyProperty.Register(nameof(CroppedRegion), typeof(Rect), typeof(ImageCropper), new PropertyMetadata(Rect.Empty, OnCroppedRegionChanged)); + /// /// Identifies the dependency property. /// diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs index baa6c8657a4..1f3bd358e38 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs @@ -5,7 +5,6 @@ using System; using System.Threading.Tasks; using Windows.Foundation; -using Windows.Graphics.Imaging; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Xaml; @@ -54,7 +53,6 @@ public partial class ImageCropper : Control private double _startY; private double _endX; private double _endY; - private Rect _currentCroppedRect = Rect.Empty; private Rect _restrictedCropRect = Rect.Empty; private Rect _restrictedSelectRect = Rect.Empty; private RectangleGeometry _outerGeometry; @@ -69,6 +67,11 @@ public ImageCropper() DefaultStyleKey = typeof(ImageCropper); } + /// + /// Occurs when the CroppedRegion property has changed. + /// + public event TypedEventHandler CroppedRegionChanged; + private Rect CanvasRect => new Rect(0, 0, _imageCanvas?.ActualWidth ?? 0, _imageCanvas?.ActualHeight ?? 0); private bool KeepAspectRatio => UsedAspectRatio > 0; @@ -398,11 +401,11 @@ public async Task SaveAsync(IRandomAccessStream stream, BitmapFileFormat bitmapF if (keepRectangularOutput || CropShape == CropShape.Rectangular) { - await CropImageAsync(Source, stream, _currentCroppedRect, bitmapFileFormat); + await CropImageAsync(Source, stream, CroppedRegion, bitmapFileFormat); return; } - await CropImageWithShapeAsync(Source, stream, _currentCroppedRect, bitmapFileFormat, CropShape); + await CropImageWithShapeAsync(Source, stream, CroppedRegion, bitmapFileFormat, CropShape); } /// @@ -439,7 +442,7 @@ public bool TrySetCroppedRegion(Rect rect) return false; } - _currentCroppedRect = rect; + CroppedRegion = rect; UpdateImageLayout(true); return true; } diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs new file mode 100644 index 00000000000..9a5b19fe2d9 --- /dev/null +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs @@ -0,0 +1,24 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Windows.Foundation; + +namespace Microsoft.Toolkit.Uwp.UI.Controls +{ + /// + /// Provides event data for the CropChanged event. + /// + public sealed class ImageCropperCroppedRegionChangedEventArgs + { + /// + /// Gets the region that is currently cropped in the control. + /// + public Rect NewRegion { get; internal set; } + + /// + /// Gets the region that was previously cropped in the control. + /// + public Rect OldRegion { get; internal set; } + } +} From a3bea61a8454cd345d8d1b983fe1cf209e19580e Mon Sep 17 00:00:00 2001 From: hhchaos Date: Wed, 25 Mar 2020 14:41:09 +0800 Subject: [PATCH 2/3] Update Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs Co-Authored-By: Michael Hawker MSFT (XAML Llama) --- .../ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs index 9a5b19fe2d9..963bb6d3bab 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropperCroppedRegionChangedEventArgs.cs @@ -7,7 +7,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls { /// - /// Provides event data for the CropChanged event. + ///为< 请参阅cref = “ ImageCropper.CroppedRegionChanged ” />事件提供事件数据。 /// public sealed class ImageCropperCroppedRegionChangedEventArgs { From bc97e998a162514a4f8a34e47d5d0cb0ee611e48 Mon Sep 17 00:00:00 2001 From: hhchaos Date: Wed, 25 Mar 2020 14:41:28 +0800 Subject: [PATCH 3/3] Update Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs Co-Authored-By: Michael Hawker MSFT (XAML Llama) --- Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs index 1f3bd358e38..a5b1f5adb77 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.cs @@ -68,7 +68,7 @@ public ImageCropper() } /// - /// Occurs when the CroppedRegion property has changed. + /// Occurs when the property has changed. /// public event TypedEventHandler CroppedRegionChanged;