From b818e7a4a9bb8ccade19254272fc15ce7c3ae916 Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Fri, 6 Jan 2023 13:18:56 +0800
Subject: [PATCH] enhance: add uri prop for ImageViewer.
---
.../Controls/Image/ImageViewer.cs | 110 +++++++++++++-----
1 file changed, 81 insertions(+), 29 deletions(-)
diff --git a/src/Shared/HandyControl_Shared/Controls/Image/ImageViewer.cs b/src/Shared/HandyControl_Shared/Controls/Image/ImageViewer.cs
index abf9598d..faf3a692 100644
--- a/src/Shared/HandyControl_Shared/Controls/Image/ImageViewer.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Image/ImageViewer.cs
@@ -195,20 +195,7 @@ public class ImageViewer : Control
///
public ImageViewer(Uri uri) : this()
{
- try
- {
- ImageSource = BitmapFrame.Create(uri);
- ImgPath = uri.AbsolutePath;
- if (File.Exists(ImgPath))
- {
- var info = new FileInfo(ImgPath);
- ImgSize = info.Length;
- }
- }
- catch
- {
- MessageBox.Show(Lang.ErrorImgPath);
- }
+ Uri = uri;
}
///
@@ -229,11 +216,8 @@ public class ImageViewer : Control
public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register(
nameof(ImageSource), typeof(BitmapFrame), typeof(ImageViewer), new PropertyMetadata(default(BitmapFrame), OnImageSourceChanged));
- private static void OnImageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var ctl = (ImageViewer) d;
- ctl.Init();
- }
+ public static readonly DependencyProperty UriProperty = DependencyProperty.Register(
+ nameof(Uri), typeof(Uri), typeof(ImageViewer), new PropertyMetadata(default(Uri), OnUriChanged));
public static readonly DependencyProperty ShowToolBarProperty = DependencyProperty.Register(
nameof(ShowToolBar), typeof(bool), typeof(ImageViewer), new PropertyMetadata(ValueBoxes.TrueBox));
@@ -250,15 +234,9 @@ public class ImageViewer : Control
internal static readonly DependencyProperty ImgSizeProperty = DependencyProperty.Register(
nameof(ImgSize), typeof(long), typeof(ImageViewer), new PropertyMetadata(-1L));
- ///
- /// 是否显示全屏按钮
- ///
internal static readonly DependencyProperty ShowFullScreenButtonProperty = DependencyProperty.Register(
nameof(ShowFullScreenButton), typeof(bool), typeof(ImageViewer), new PropertyMetadata(ValueBoxes.FalseBox));
- ///
- /// 关闭按钮是否显示中
- ///
internal static readonly DependencyProperty ShowCloseButtonProperty = DependencyProperty.Register(
nameof(ShowCloseButton), typeof(bool), typeof(ImageViewer), new PropertyMetadata(ValueBoxes.FalseBox));
@@ -312,6 +290,12 @@ public class ImageViewer : Control
set => SetValue(ImageSourceProperty, value);
}
+ public Uri Uri
+ {
+ get => (Uri) GetValue(UriProperty);
+ set => SetValue(UriProperty, value);
+ }
+
public bool ShowToolBar
{
get => (bool) GetValue(ShowToolBarProperty);
@@ -515,19 +499,19 @@ public class ImageViewer : Control
_imgWidHeiScale = width / height;
var scaleWindow = ActualWidth / ActualHeight;
+ ImageScale = 1;
+
if (_imgWidHeiScale > scaleWindow)
{
if (width > ActualWidth)
+ {
ImageScale = ActualWidth / width;
+ }
}
else if (height > ActualHeight)
{
ImageScale = ActualHeight / height;
}
- else
- {
- ImageScale = 1;
- }
ImageMargin = new Thickness((ActualWidth - ImageWidth) / 2, (ActualHeight - ImageHeight) / 2, 0, 0);
@@ -955,4 +939,72 @@ public class ImageViewer : Control
_mouseMoveBinding = new MouseBinding(ControlCommands.MouseMove, newValue);
InputBindings.Add(_mouseMoveBinding);
}
+
+ private static void OnImageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((ImageViewer) d).OnImageSourceChanged();
+ }
+
+ private void OnImageSourceChanged()
+ {
+ Init();
+ }
+
+ private static void OnUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var self = (ImageViewer) d;
+
+ if (e.NewValue is Uri uri)
+ {
+ self.ImageSource = GetBitmapFrame(uri);
+ self.Init();
+ }
+ else
+ {
+ self.ImageSource = null;
+ }
+
+ static BitmapFrame GetBitmapFrame(Uri source)
+ {
+ try
+ {
+ return BitmapFrame.Create(source);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
+
+ private void OnUriChanged(Uri newValue)
+ {
+ if (newValue is not null)
+ {
+ ImageSource = GetBitmapFrame(newValue);
+ ImgPath = newValue.AbsolutePath;
+
+ if (File.Exists(ImgPath))
+ {
+ ImgSize = new FileInfo(ImgPath).Length;
+ }
+ }
+ else
+ {
+ ImageSource = null;
+ ImgPath = string.Empty;
+ }
+
+ static BitmapFrame GetBitmapFrame(Uri source)
+ {
+ try
+ {
+ return BitmapFrame.Create(source);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
}