WPF——对控件进行缩放

6 篇文章 0 订阅

对控件进行缩放

控件的缩放属于 Transform, 而对于需要以鼠标位置为中心进行缩放则为 MatrixTransform, 为保证 MVVM 的一致性,采用 System.Windows.Interactivity 中的 Behavior 实现, 下面为实现控件缩放的方法.

StackOverflow: WPF Zoom Canvas Center on Mouse Position

ZoomOnMouseWheel.cs

using System.Windows;
using System.Windows.Input;
using System.Windows.Interactivity;
using System.Windows.Media;

namespace Demo.Utils
{
    public class ZoomOnMouseWheel : Behavior<FrameworkElement>
    {
        public Key? ModifierKey { get; set; } = null;
        public TransformMode TranformMode { get; set; } = TransformMode.Render;

        private Transform _transform;

        protected override void OnAttached()
        {
            if (TranformMode == TransformMode.Render)
            {
                _transform = AssociatedObject.RenderTransform = new MatrixTransform();
            }
            else
            {
                _transform = AssociatedObject.LayoutTransform = new MatrixTransform();
            }

            AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
        }

        private void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            if ((!ModifierKey.HasValue || !Keyboard.IsKeyDown(ModifierKey.Value)) && ModifierKey.HasValue)
            {
                return;
            }

            if (!(_transform is MatrixTransform transform))
            {
                return;
            }

            var pos1 = e.GetPosition(AssociatedObject);
            var scale = e.Delta > 0 ? 1.1 : 1 / 1.1;
            var mat = transform.Matrix;
            mat.ScaleAt(scale, scale, pos1.X, pos1.Y);
            transform.Matrix = mat;
            e.Handled = true;
        }
    }

    public enum TransformMode
    {
        Layout,
        Render,
    }
}

View.xaml

<UserControl ...
    xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:Demo.Utils">

    <Canvas>
        <interactivity:Interaction.Behaviors>
            <local:ZoomOnMouseWheel ModifierKey="LeftCtrl" TransformMode="Layout">
        </interactivity:Interaction.Behaviors>
    </Canvas>
</UserControl>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值