From 0ae2576c609815e01460cc38db344fb0651a2c22 Mon Sep 17 00:00:00 2001 From: noctwolf Date: Sat, 20 Jul 2019 17:36:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E4=B8=8D=E6=98=AF100%=E6=97=B6=E5=87=BA=E9=94=99?= =?UTF-8?q?=EF=BC=8C=E6=AF=94=E5=A6=82125%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandyControl_Shared/Controls/Image/ImageBlock.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs b/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs index 9b9b37b1..de696209 100644 --- a/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs +++ b/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs @@ -154,23 +154,24 @@ namespace HandyControl.Controls if (Source != null && Source is BitmapSource source) { // ReSharper disable once AssignNullToNotNullAttribute - var croppedBitmap = new CroppedBitmap(source, CalDisplayRect()); + var croppedBitmap = new CroppedBitmap(source, + CalDisplayRect(source.PixelWidth / Columns, source.PixelHeight / Rows)); dc.DrawImage(croppedBitmap, new Rect(0, 0, RenderSize.Width, RenderSize.Height)); } } - private Int32Rect CalDisplayRect() + private Int32Rect CalDisplayRect(int width, int height) { if (_currentIndex > _indexMax) { _currentIndex = _indexMin; } - var x = (int) (_currentIndex % Columns * RenderSize.Width); + var x = _currentIndex % Columns * width; // ReSharper disable once PossibleLossOfFraction - var y = (int) (_currentIndex / Columns * RenderSize.Height); + var y = _currentIndex / Columns * height; - var rect = new Int32Rect(x, y, (int)RenderSize.Width, (int)RenderSize.Height); + var rect = new Int32Rect(x, y, width, height); _currentIndex++; return rect; } From a13e41bdc347467718e6410d8b05e2d87aa6816e Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Sat, 20 Jul 2019 19:42:40 +0800 Subject: [PATCH 2/2] merge pr --- .../Controls/ImageBlockDemoCtl.xaml | 14 +++--- .../Controls/Image/ImageBlock.cs | 45 ++++++++++++------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ImageBlockDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ImageBlockDemoCtl.xaml index e226326e..75ee0588 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ImageBlockDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ImageBlockDemoCtl.xaml @@ -5,16 +5,16 @@ xmlns:hc="https://handyorg.github.io/handycontrol"> - - - - + + + + - + - - + + \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs b/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs index de696209..ab21849f 100644 --- a/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs +++ b/src/Shared/HandyControl_Shared/Controls/Image/ImageBlock.cs @@ -11,12 +11,18 @@ namespace HandyControl.Controls { private readonly DispatcherTimer _dispatcherTimer; + private BitmapSource _source; + private int _indexMax; private int _indexMin; private int _currentIndex; + private int _blockWidth; + + private int _blockHeight; + public ImageBlock() { _dispatcherTimer = new DispatcherTimer @@ -26,17 +32,20 @@ namespace HandyControl.Controls _dispatcherTimer.Tick += DispatcherTimer_Tick; } - private void OnPositionsChanged() + private void UpdateDatas() { + if (_source == null) return; _indexMin = StartRow * Columns + StartColumn; _indexMax = EndRow * Columns + EndColumn; _currentIndex = _indexMin; + _blockWidth = _source.PixelWidth / Columns; + _blockHeight = _source.PixelHeight / Rows; } private static void OnPositionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var ctl = (ImageBlock)d; - ctl.OnPositionsChanged(); + ctl.UpdateDatas(); } private void DispatcherTimer_Tick(object sender, EventArgs e) => InvalidateVisual(); @@ -106,7 +115,7 @@ namespace HandyControl.Controls public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register( "Columns", typeof(int), typeof(ImageBlock), new FrameworkPropertyMetadata(ValueBoxes.Int1Box, - FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender), obj => (int)obj >= 1); + FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender, OnPositionsChanged), obj => (int)obj >= 1); public int Columns { @@ -116,7 +125,7 @@ namespace HandyControl.Controls public static readonly DependencyProperty RowsProperty = DependencyProperty.Register( "Rows", typeof(int), typeof(ImageBlock), new FrameworkPropertyMetadata(ValueBoxes.Int1Box, - FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender), obj => (int)obj >= 1); + FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender, OnPositionsChanged), obj => (int)obj >= 1); public int Rows { @@ -141,7 +150,14 @@ namespace HandyControl.Controls public static readonly DependencyProperty SourceProperty = DependencyProperty.Register( "Source", typeof(ImageSource), typeof(ImageBlock), new FrameworkPropertyMetadata(default(ImageSource), - FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender)); + FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender, OnSourceChanged)); + + private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var ctl = (ImageBlock)d; + ctl._source = e.NewValue as BitmapSource; + ctl.UpdateDatas(); + } public ImageSource Source { @@ -151,27 +167,22 @@ namespace HandyControl.Controls protected override void OnRender(DrawingContext dc) { - if (Source != null && Source is BitmapSource source) - { - // ReSharper disable once AssignNullToNotNullAttribute - var croppedBitmap = new CroppedBitmap(source, - CalDisplayRect(source.PixelWidth / Columns, source.PixelHeight / Rows)); - dc.DrawImage(croppedBitmap, new Rect(0, 0, RenderSize.Width, RenderSize.Height)); - } + if (_source == null) return; + var croppedBitmap = new CroppedBitmap(_source, CalDisplayRect()); + dc.DrawImage(croppedBitmap, new Rect(0, 0, RenderSize.Width, RenderSize.Height)); } - private Int32Rect CalDisplayRect(int width, int height) + private Int32Rect CalDisplayRect() { if (_currentIndex > _indexMax) { _currentIndex = _indexMin; } - var x = _currentIndex % Columns * width; - // ReSharper disable once PossibleLossOfFraction - var y = _currentIndex / Columns * height; + var x = _currentIndex % Columns * _blockWidth; + var y = _currentIndex / Columns * _blockHeight; - var rect = new Int32Rect(x, y, width, height); + var rect = new Int32Rect(x, y, _blockWidth, _blockHeight); _currentIndex++; return rect; }