WPF 实现图片切成九宫格控件~

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 实现图片切成九宫格控件~相关的知识,希望对你有一定的参考价值。

WPF开发者QQ群: 340500857

       由于微信群人数太多入群请添加小编微信号

 yanjinhuawechat 或 W_Feng_aiQ 入群

 需备注WPF开发者 

  PS:有更好的方式欢迎推荐。

  接着上一篇倒计时控件

01

代码如下

一、创建 CropControl.cs代码如下。

(修改RowColumn =“6” 或者“12”  甚至其他 都能拆分原图为

多张小图)

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WPFDevelopers.Controls

    [TemplatePart(Name = UniformGridTemplateName, Type = typeof(UniformGrid))]
    public class CropControl: Control
    
        private const string UniformGridTemplateName = "PART_UniformGrid";

        private UniformGrid _uniformGrid;

        public ImageSource ImageSource
        
            get  return (ImageSource)GetValue(ImageSourceProperty); 
            set  SetValue(ImageSourceProperty, value); 
        

        public static readonly DependencyProperty ImageSourceProperty =
            DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(CropControl), new PropertyMetadata(null));

        public int RowColumn
        
            get  return (int)GetValue(RowColumnProperty); 
            set  SetValue(RowColumnProperty, value); 
        

        public static readonly DependencyProperty RowColumnProperty =
            DependencyProperty.Register("RowColumn", typeof(int), typeof(CropControl), new PropertyMetadata(3));

        static CropControl()
        
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CropControl), new FrameworkPropertyMetadata(typeof(CropControl)));
        
        public override void OnApplyTemplate()
        
            base.OnApplyTemplate();
            _uniformGrid = GetTemplateChild(UniformGridTemplateName) as UniformGrid;
            if (ImageSource == null || _uniformGrid == null) return;
            
            BitmapSource imgSource = (BitmapSource)ImageSource;
            int w = 0, h = 0;
            if (!imgSource.PixelWidth.Equals(0)
                &&
                !imgSource.PixelHeight.Equals(0))
            
                w = imgSource.PixelWidth / RowColumn;
                h = (int)imgSource.PixelHeight / RowColumn;
                _uniformGrid.Width = imgSource.PixelWidth;
                _uniformGrid.Height = imgSource.PixelHeight;
            
            for (int i = 0; i < RowColumn; i++)
            
                for (int j = 0; j < RowColumn; j++)
                
                    var rect = new Rectangle
                    
                        Fill = new ImageBrush  ImageSource = new CroppedBitmap(imgSource, new Int32Rect(j * w, i * h, w, h)) ,
                        StrokeThickness = .5,
                        Stroke = Brushes.White,
                        Cursor = Cursors.Hand
                    ;
                    rect.RenderTransformOrigin = new Point(.5, .5);
                    rect.RenderTransform = new ScaleTransform();
                    rect.MouseMove += (sender, ex) =>
                    
                        var rect1 = sender as Rectangle;
                        Panel.SetZIndex(rect1, 1);
                        var doubleAnimation = new DoubleAnimation
                        
                            To = 2,
                            Duration = TimeSpan.FromMilliseconds(100),
                        ;
                        var scaleTransform = rect1.RenderTransform as ScaleTransform;
                        scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, doubleAnimation);
                        scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, doubleAnimation);
                    ;
                    rect.MouseLeave += (sender, ex) =>
                    
                        var rect1 = sender as Rectangle;
                        Panel.SetZIndex(rect1, 0);
                        var scaleTransform = rect1.RenderTransform as ScaleTransform;
                        var doubleAnimation = new DoubleAnimation
                        
                            To = 1,
                            Duration = TimeSpan.FromMilliseconds(100)
                        ;
                        scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, doubleAnimation);
                        scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, doubleAnimation);
                    ;
                    _uniformGrid.Children.Add(rect);
                
            
        
    

二、CropControl.xaml 代码如下

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:controls="clr-namespace:WPFDevelopers.Controls">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Basic/ControlBasic.xaml"/>
        <ResourceDictionary Source="Basic/Animations.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <Style TargetType="x:Type controls:CropControl" BasedOn="StaticResource ControlBasicStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type controls:CropControl">
                    <UniformGrid Rows="TemplateBinding RowColumn" Columns="TemplateBinding RowColumn"
                                 x:Name="PART_UniformGrid"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

三、CropControlExample.xaml 代码如下

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.CropControlExample"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
             xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <wpfdev:CropControl ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Crop/0.jpg"/>
    </Grid>
</UserControl>

02


效果预览

鸣谢素材提供者 - 关关(代强)

源码地址如下

Github:https://github.com/WPFDevelopersOrg

Gitee:https://gitee.com/WPFDevelopersOrg

WPF开发者QQ群: 340500857 

Github:https://github.com/WPFDevelopersOrg

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/WPFDevelopersOrg

扫一扫关注我们,

更多知识早知道!

点击阅读原文可跳转至源代码

以上是关于WPF 实现图片切成九宫格控件~的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发之代码之九宫格

JS  实现九宫格算法

Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现

九宫格小游戏源码分享

Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现

九宫格的计算思路