• c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果


    一、缩放要求

    1.缩放对象在可视区域内,已对象的中心点进行缩放。

    2.缩放对象比可视区大,并且对象各边界都在可视区外围,那么已鼠标位置进行缩放。

    3.缩放对象比可视区大,但是缩放后某一边界在可视区的对应边界内,那么该边界与可视区边界对齐,对向缩放。

    二、缩放代买片段

     1         private void Window_MouseWheel(object sender, MouseWheelEventArgs e) {
     2             if (e.Delta == 0) return;
     3 
     4 
     5             double d = e.Delta / Math.Abs(e.Delta);
     6 
     7             if (_scaleValue < 0.5 && d < 0) return;
     8 
     9             if (_scaleValue > 20 && d > 0) return;
    10 
    11             _scaleValue += d * .2;
    12 
    13             //获取鼠标在缩放之前的目标上的位置
    14             Point targetZoomFocus1 = e.GetPosition(target);
    15 
    16             //获取目标在缩放之前的Rect
    17             Rect beforeScaleRect =
    18                 target.RenderTransform.TransformBounds(new Rect(target.RenderSize));
    19 
    20             //缩放的中心点为左上角(0,0)
    21             scaler.ScaleX = _scaleValue;
    22             scaler.ScaleY = _scaleValue;
    23 
    24             //获取鼠标在缩放之后的目标上的位置
    25             Point targetZoomFocus2 = new Point(targetZoomFocus1.X * (1 + d * .2), targetZoomFocus1.Y * (1 + d * .2));
    26 
    27             //获取目标在缩放之后的Rect
    28             Rect afterScaleRect = target.RenderTransform.TransformBounds(new Rect(target.RenderSize));
    29 
    30             //算的缩放前后鼠标的位置间的差
    31             Vector v = targetZoomFocus2 - targetZoomFocus1;
    32                         
    33 
    34             if (afterScaleRect.Size.Width <= _viewportSize.Width) {
    35                 //缩放之后居中
    36                 double widthHalfDelta = (Container.RenderSize.Width - afterScaleRect.Width) / 2;
    37                 translater.X = widthHalfDelta;
    38             }
    39             else if (afterScaleRect.X - v.X > 0) {
    40                 //目标左边界与可视左边界对齐
    41                 translater.X = 0;
    42             }
    43             else if (afterScaleRect.X + afterScaleRect.Width - v.X < Container.RenderSize.Width) {
    44                 //目标右边界与可视右边界对齐
    45                 translater.X = Container.RenderSize.Width - afterScaleRect.Size.Width;
    46             }
    47             else {
    48                 //减去鼠标点在缩放前后之间的差值,实际上就是以鼠标点为中心进行缩放
    49                 translater.X -= v.X;
    50             }
    51 
    52 
    53             if (afterScaleRect.Size.Height <= _viewportSize.Height) {
    54                 double heightHalfDleta = (Container.RenderSize.Height - afterScaleRect.Height) / 2;
    55                 translater.Y = heightHalfDleta;
    56             }
    57             else if (afterScaleRect.Y - v.Y > 0) {
    58                 translater.Y = 0;
    59             }
    60             else if (afterScaleRect.Y + afterScaleRect.Height - v.Y < Container.RenderSize.Height) {
    61                 translater.Y = Container.RenderSize.Height - afterScaleRect.Size.Height;
    62             }
    63             else {
    64                 translater.Y -= v.Y;
    65             }
    66         }

    代码:

    http://download.csdn.net/download/kongxh_1981/9161521

  • 相关阅读:
    e-icon-picker 基于element-ui图标和fontawesome图标选择器组件
    js 前端将平级数据转为树形数据的方法
    发送邮件报User does not have send-as privilege for错误的解决办法
    Dynamics 365利用email实体的DeliverIncomingEmail来做抓取邮件的进一步处理
    Dynamics 365中邮件模板的使用
    导入解决方案报错:Unable to retrieve customActivityInfo using RetrieveCustomActivityInfoWithSandboxPlugin
    Dynamics 365组织服务使用Query Expression查询数据时候请谨慎使用ConditionOperator.Contains
    【代码审计】ESPCMSP8(易思企业建站管理系统)漏洞报告
    MS16-072域内中间人攻击
    域控权限提升PTH攻击
  • 原文地址:https://www.cnblogs.com/kongxianghai/p/2562966.html
Copyright © 2020-2023  润新知