zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Calling a parent window function from an iframe
    JSON with Java
    Posting array of JSON objects to MVC3 action method via jQuery ajax
    What's the difference between jquery.js and jquery.min.js?
    jquery loop on Json data using $.each
    jquery ui tabs详解(中文)
    DataTables warning requested unknown parameter
    Datatables 1.10.x在命名上与1.9.x
    jQuery 1.x and 2.x , which is better?
    DataTabless Add rows
  • 原文地址:https://www.cnblogs.com/kongxianghai/p/2562966.html
Copyright © 2011-2022 走看看