zoukankan      html  css  js  c++  java
  • WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小

    xaml代码:

    复制代码
     1 <Canvas Name="movBg">  
     2             <Canvas.Background>  
     3                 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">  
     4                     <GradientStop Color="White" Offset="0" />  
     5                     <GradientStop Color="#FFF5FF00" Offset="1" />  
     6                 </LinearGradientBrush>  
     7             </Canvas.Background>  
     8             <Canvas Canvas.Top="50" Canvas.Left="50"  Height="100" HorizontalAlignment="Left" Name="mov" VerticalAlignment="Top" Width="200" MouseLeftButtonDown="mov_MouseLeftButtonDown" MouseLeftButtonUp="mov_MouseLeftButtonUp" MouseMove="mov_MouseMove" MouseWheel="mov_MouseWheel" MaxWidth="300" MaxHeight="300">  
     9                 <Border BorderThickness="1" BorderBrush="Black" Width="{Binding ElementName=mov,Path=Width}" Height="{Binding ElementName=mov,Path=Height}" MaxWidth="{Binding ElementName=mov,Path=MaxWidth}" MaxHeight="{Binding ElementName=mov,Path=MaxHeight}"></Border>  
    10                 <Canvas.Background>  
    11                     <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">  
    12                         <GradientStop Color="White" Offset="0" />  
    13                         <GradientStop Color="#FFD679F2" Offset="1" />  
    14                     </LinearGradientBrush>  
    15                 </Canvas.Background>  
    16             </Canvas>  
    17 </Canvas>  
    复制代码

    C#代码:

    复制代码
      1 #region 拖动选区,滚轴改变大小  
      2         //鼠标相对于被拖动的Canvas控件mov的坐标  
      3         Point childPoint = new Point();  
      4         //鼠标相对于作为容器的Canvas控件movBg的坐标  
      5         Point prevPoint = new Point();  
      6   
      7         private void mov_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)  
      8         {  
      9             childPoint = e.GetPosition(mov);  
     10         }  
     11   
     12         private void mov_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)  
     13         {  
     14             Canvas c = sender as Canvas;  
     15             Rect rc = new Rect(1, 1, movBg.ActualWidth, movBg.ActualHeight);  
     16             Rect childRc = new Rect(Canvas.GetLeft(c), Canvas.GetTop(c), c.ActualWidth, c.ActualHeight);  
     17             if (!rc.Contains(childRc))  
     18             {  
     19                 childRc = AutoResize(rc, childRc);  
     20                 c.SetValue(Canvas.LeftProperty, childRc.Left);  
     21                 c.SetValue(Canvas.TopProperty, childRc.Top);  
     22                 c.Width = childRc.Width;  
     23                 c.Height = childRc.Height;  
     24             }  
     25             c.ReleaseMouseCapture();  
     26         }  
     27   
     28         private void mov_MouseMove(object sender, MouseEventArgs e)  
     29         {  
     30             if (e.LeftButton == MouseButtonState.Pressed)  
     31             {  
     32                 Canvas c = sender as Canvas;  
     33   
     34                 prevPoint = e.GetPosition(movBg);  
     35                 double x = prevPoint.X - childPoint.X;  
     36                 double y = prevPoint.Y - childPoint.Y;  
     37   
     38                 Rect rc = new Rect(1, 1, movBg.ActualWidth, movBg.ActualHeight);  
     39                 Rect childRc = new Rect(Canvas.GetLeft(c), Canvas.GetTop(c), c.ActualWidth, c.ActualHeight);  
     40                 if (!rc.Contains(childRc))  
     41                 {  
     42                     childRc = AutoResize(rc, childRc);  
     43                     c.SetValue(Canvas.LeftProperty, childRc.Left);  
     44                     c.SetValue(Canvas.TopProperty, childRc.Top);  
     45                     c.Width = childRc.Width;  
     46                     c.Height = childRc.Height;  
     47                     c.ReleaseMouseCapture();  
     48                 }  
     49                 else  
     50                 {  
     51                     c.SetValue(Canvas.LeftProperty, prevPoint.X - childPoint.X);  
     52                     c.SetValue(Canvas.TopProperty, prevPoint.Y - childPoint.Y);  
     53                     c.CaptureMouse();  
     54                 }  
     55             }  
     56         }  
     57   
     58         private Rect AutoResize(Rect outerRc, Rect innerRc)  
     59         {  
     60             double with = innerRc.Width;  
     61             double height = innerRc.Height;  
     62   
     63             if (innerRc.Left < outerRc.Left)  
     64             {  
     65                 innerRc.X = outerRc.Left + 1;  
     66                 innerRc.Width = with;  
     67             }  
     68             if (innerRc.Right > outerRc.Right)  
     69             {  
     70                 innerRc.X = outerRc.Right - with - 1;  
     71                 innerRc.Width = with;  
     72             }  
     73             if (innerRc.Top < outerRc.Top)  
     74             {  
     75                 innerRc.Y = outerRc.Top + 1;  
     76                 innerRc.Height = height;  
     77             }  
     78             if (innerRc.Bottom > outerRc.Bottom)  
     79             {  
     80                 innerRc.Y = outerRc.Bottom - height - 1;  
     81                 innerRc.Height = height;  
     82             }  
     83             return innerRc;  
     84         }  
     85   
     86         private void mov_MouseWheel(object sender, MouseWheelEventArgs e)  
     87         {  
     88             double val = e.Delta * 0.001;  
     89             double wl = mov.Width * (val / 0.12) * 0.02;  
     90             double hl = mov.Height * (val / 0.12) * 0.02;  
     91   
     92             if ((Canvas.GetLeft(mov) - wl/2.0) > 0 && (Canvas.GetLeft(mov) + wl + mov.Width) <= movBg.ActualWidth &&  
     93                 (Canvas.GetTop(mov) - hl/2.0) > 0 && (Canvas.GetTop(mov) + hl + mov.Height) <= movBg.ActualHeight &&  
     94                 (mov.Width + wl) < mov.MaxWidth && (mov.Height + hl) < mov.MaxHeight)  
     95             {  
     96                 mov.SetValue(Canvas.LeftProperty, Canvas.GetLeft(mov) - wl / 2.0);  
     97                 mov.SetValue(Canvas.TopProperty, Canvas.GetTop(mov) - hl / 2.0);  
     98                 mov.Width += wl;  
     99                 mov.Height += hl;  
    100   
    101             }  
    102             return;  
    103         }  
    104         #endregion  
    复制代码
  • 相关阅读:
    174. Dungeon Game
    240. Search a 2D Matrix II
    300. Longest Increasing Subsequence
    test markdown style
    多源多汇费用流——poj2516
    费用流消圈算法(构造残量网络)
    费用流模板(带权二分图匹配)——hdu1533
    最大流模板——进阶指南整理
    最大流任务调度+离散化——hdu2883
    最大流拆点——hdu2732,poj3436
  • 原文地址:https://www.cnblogs.com/chen110xi/p/6757584.html
Copyright © 2011-2022 走看看