WPF 控件的缩放和移动

WPF 控件的缩放和移动

1.页面代码

xml 复制代码
<ContentControl ClipToBounds="True" Cursor="SizeAll">
     <Viewbox
         x:Name="viewbox"
         MouseDown="viewbox_MouseDown"
         MouseMove="viewbox_MouseMove"
         MouseWheel="Viewbox_MouseWheel">
         <Viewbox.RenderTransform>
             <TransformGroup>
                 <!--  将下面的三种转换组合到一起  -->
                 <ScaleTransform x:Name="scaler"/>
                 <TranslateTransform x:Name="transer" />
             </TransformGroup>
         </Viewbox.RenderTransform>
         <Image Name="image" Source="{Binding ImageSource, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}" />
     </Viewbox>
 </ContentControl>

ScaleTransform 用于进行缩放

TranslateTransform 用于进行位置的移动

ViewBox中可以放入不同的控件不光可以是图片

ContentControl 可以对超过容器的部分进行剪切,这样就不会覆盖到其他控件了

2.后台代码

csharp 复制代码
public partial class ImageSuper : UserControl
{
    public ImageSuper()
    {
        InitializeComponent();
    }

    public ImageSource ImageSource
    {
        get { return (ImageSource)GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }
    public static readonly DependencyProperty ImageSourceProperty =
        DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageSuper), null);

    public double Scale
    {
        get { return (double)GetValue(ScaleProperty); }
        set { SetValue(ScaleProperty, value); }
    }
    public static readonly DependencyProperty ScaleProperty =
        DependencyProperty.Register("Scale", typeof(double), typeof(ImageSuper),
            new PropertyMetadata(default(double), new PropertyChangedCallback(ScalePropertyChanged)));
    public double TranserX
    {
        get { return (double)GetValue(TranserXProperty); }
        set { SetValue(TranserXProperty, value); }
    }
    public static readonly DependencyProperty TranserXProperty =
        DependencyProperty.Register("TranserX", typeof(double), typeof(ImageSuper),
            new PropertyMetadata(default(double), new PropertyChangedCallback(TranserPropertyChanged)));
    public double TranserY
    {
        get { return (double)GetValue(TranserYProperty); }
        set { SetValue(TranserYProperty, value); }
    }
    public static readonly DependencyProperty TranserYProperty =
        DependencyProperty.Register("TranserY", typeof(double), typeof(ImageSuper),
            new PropertyMetadata(default(double), new PropertyChangedCallback(TranserPropertyChanged)));

    public static void ScalePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        (d as ImageSuper).DoScale();
    }
    public static void TranserPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        (d as ImageSuper).DoMove();
    }

    /// <summary>
    /// 缩放图片。最小为0.1倍,最大为0倍
    /// </summary>
    private void DoScale()
    {
        // 限制最大、最小缩放倍数
        if (scaler.ScaleX + Scale < 0.1 || scaler.ScaleX + Scale > 80) return;

        scaler.ScaleX = Scale;
        scaler.ScaleY = Scale;
    }

    /// <summary>
    /// 移动图片
    /// </summary>
    private void DoMove()
    {
        transer.X = TranserX;
        transer.Y = TranserY;
    }

    
    private void Viewbox_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        var point = e.GetPosition(viewbox);
        var delta = e.Delta * 0.002;
        Scale += delta;
        TranserX -= point.X * delta;
        TranserY -= point.Y * delta;
    }

    private Point lastMousePosition;
    private void viewbox_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Point currentMousePosition = e.GetPosition(image);
        lastMousePosition = currentMousePosition;
    }

    private void viewbox_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            // 获取鼠标相对于图片的位置
            Point currentMousePosition = e.GetPosition(image);

            // 获取鼠标在X轴和Y轴上的移动距离
            double deltaX = currentMousePosition.X - lastMousePosition.X;
            double deltaY = currentMousePosition.Y - lastMousePosition.Y;

            TranserX += deltaX / 10;
            TranserY += deltaY / 10;
        }
    }
}

3.总结

目前这个是直接做成了第三方控件的样式使用的,还有一个旋转的属性但是因为项目不需要所有就没有加进去.还有一个自适应大小的功能就是把Scale 的值改为1,TranserX 和TranserY 的值改为0就可以了.

2023/11/20

相关推荐
code bean4 小时前
【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)
wpf
baivfhpwxf20234 小时前
WPF 颜色间的转换 Color,Brush
wpf
Java Fans21 小时前
WPF使用SQLite与JSON文本文件结合存储体侧平衡数据的设计与实现
sqlite·json·wpf
code_shenbing21 小时前
WPF高级用法示例
c#·wpf·wpf高级
冰茶_21 小时前
WPF之XAML基础
microsoft·微软·c#·.net·wpf·xaml·xamarin
呼Lu噜21 小时前
WPF-遵循MVVM框架创建图表的显示【保姆级】
前端·后端·wpf
Zhen (Evan) Wang2 天前
.NET 6 + Dapper + User-Defined Table Type
sqlserver·c#·.net·wpf
界面开发小八哥3 天前
界面控件DevExpress WPF v25.1预览 - 支持Windows 11系统强调色
windows·wpf·界面控件·devexpress·ui开发·.net 9
军训猫猫头3 天前
89.WPF 中实现便捷的数字输入框:DecimalUpDown 控件的使用 WPF例子 C#例子.
开发语言·c#·wpf
Pasregret3 天前
缓存与数据库一致性深度解析与解决方案
数据库·缓存·wpf