diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs
index 82614619a95..51a54dfa524 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Events.cs
@@ -103,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);
@@ -116,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);
@@ -160,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 44c216e0e7f..073b2533693 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/ImageCropper/ImageCropper.Logic.cs
@@ -28,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);
}
}
@@ -44,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);
}
}
@@ -69,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(
@@ -271,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);
@@ -557,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..a5b1f5adb77 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 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..963bb6d3bab
--- /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
+{
+ ///
+ ///为< 请参阅cref = “ ImageCropper.CroppedRegionChanged ” />事件提供事件数据。
+ ///
+ 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; }
+ }
+}