WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小
xaml代码:
<Canvas Name="movBg">
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0" />
<GradientStop Color="#FFF5FF00" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
<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">
<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>
<Canvas.Background>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="White" Offset="0" />
<GradientStop Color="#FFD679F2" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Canvas>
C#代码:
#region 拖动选区,滚轴改变大小
//鼠标相对于被拖动的Canvas控件mov的坐标
Point childPoint = new Point();
//鼠标相对于作为容器的Canvas控件movBg的坐标
Point prevPoint = new Point(); private void mov_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
childPoint = e.GetPosition(mov);
} private void mov_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Canvas c = sender as Canvas;
Rect rc = new Rect(, , movBg.ActualWidth, movBg.ActualHeight);
Rect childRc = new Rect(Canvas.GetLeft(c), Canvas.GetTop(c), c.ActualWidth, c.ActualHeight);
if (!rc.Contains(childRc))
{
childRc = AutoResize(rc, childRc);
c.SetValue(Canvas.LeftProperty, childRc.Left);
c.SetValue(Canvas.TopProperty, childRc.Top);
c.Width = childRc.Width;
c.Height = childRc.Height;
}
c.ReleaseMouseCapture();
} private void mov_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Canvas c = sender as Canvas; prevPoint = e.GetPosition(movBg);
double x = prevPoint.X - childPoint.X;
double y = prevPoint.Y - childPoint.Y; Rect rc = new Rect(, , movBg.ActualWidth, movBg.ActualHeight);
Rect childRc = new Rect(Canvas.GetLeft(c), Canvas.GetTop(c), c.ActualWidth, c.ActualHeight);
if (!rc.Contains(childRc))
{
childRc = AutoResize(rc, childRc);
c.SetValue(Canvas.LeftProperty, childRc.Left);
c.SetValue(Canvas.TopProperty, childRc.Top);
c.Width = childRc.Width;
c.Height = childRc.Height;
c.ReleaseMouseCapture();
}
else
{
c.SetValue(Canvas.LeftProperty, prevPoint.X - childPoint.X);
c.SetValue(Canvas.TopProperty, prevPoint.Y - childPoint.Y);
c.CaptureMouse();
}
}
} private Rect AutoResize(Rect outerRc, Rect innerRc)
{
double with = innerRc.Width;
double height = innerRc.Height; if (innerRc.Left < outerRc.Left)
{
innerRc.X = outerRc.Left + ;
innerRc.Width = with;
}
if (innerRc.Right > outerRc.Right)
{
innerRc.X = outerRc.Right - with - ;
innerRc.Width = with;
}
if (innerRc.Top < outerRc.Top)
{
innerRc.Y = outerRc.Top + ;
innerRc.Height = height;
}
if (innerRc.Bottom > outerRc.Bottom)
{
innerRc.Y = outerRc.Bottom - height - ;
innerRc.Height = height;
}
return innerRc;
} private void mov_MouseWheel(object sender, MouseWheelEventArgs e)
{
double val = e.Delta * 0.001;
double wl = mov.Width * (val / 0.12) * 0.02;
double hl = mov.Height * (val / 0.12) * 0.02; if ((Canvas.GetLeft(mov) - wl/2.0) > && (Canvas.GetLeft(mov) + wl + mov.Width) <= movBg.ActualWidth &&
(Canvas.GetTop(mov) - hl/2.0) > && (Canvas.GetTop(mov) + hl + mov.Height) <= movBg.ActualHeight &&
(mov.Width + wl) < mov.MaxWidth && (mov.Height + hl) < mov.MaxHeight)
{
mov.SetValue(Canvas.LeftProperty, Canvas.GetLeft(mov) - wl / 2.0);
mov.SetValue(Canvas.TopProperty, Canvas.GetTop(mov) - hl / 2.0);
mov.Width += wl;
mov.Height += hl; }
return;
}
#endregion
WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小的更多相关文章
- 在WPF窗体中重绘
原文:在WPF窗体中重绘 写这篇主要是为了验证任何元素自身都具备绘图功能. 在默认Window中重写OnRender方法 protected override void OnRender(Draw ...
- WPF 窗体中获取键盘和鼠标无操作时的超时提示
原文:WPF 窗体中获取键盘和鼠标无操作时的超时提示 通过调用Windows API中的GetLastInputInfo来获取最后一次输入的时间 , , ); timer.Tic ...
- wpf窗体中复合控件焦点控制
1. 自定义控件 在UserControl标记中 <UserControl KeyboardNavigation.ControlTabNavigation="Local ...
- wpf 窗体中显示当前系统时间
先看一下效果: 这其实是我放置了两个TextBlock,上面显示当前的日期,下面显示时间. 接下来展示一下代码: 在XAML中: <StackPanel Width="205" ...
- WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)
如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...
- 在WPF中的Canvas上实现控件的拖动、缩放
如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...
- WPF实现窗体中的悬浮按钮
WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘. 控件XAML代码: <Button x:Class="SunCreate.Common.Controls.FloatBut ...
- 在Winform窗体中使用WPF控件(附源码)
原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件.原有是我在百度上搜索相关信息无果,遂干脆动手自己实现. W ...
随机推荐
- vijosP1038 添加括号
vijosP1038 添加括号 链接:https://vijos.org/p/1038 [思路] 区间DP. 本题的关键在于如何输出解.对于求和表达式而言可以用一个p[][]记录决策然后递归输出,对于 ...
- jvm参数优化
一.HotSpot JVM 提供了三类参数 现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.例如:自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化等.虽然有 ...
- hadoop作业调优参数整理及原理【转】
1 Map side tuning参数 1.1 MapTask运行内部原理 当map task开始运算,并产生中间数据时,其产生的中间结果并非直接就简单的写入磁盘.这中间的过程比较复杂,并且利用到了内 ...
- 1 weekend110的复习 + hadoop中的序列化机制 + 流量求和mr程序开发
以上是,weekend110的yarn的job提交流程源码分析的复习总结 下面呢,来讲weekend110的hadoop中的序列化机制 1363157985066 13726230503 ...
- mysql常用的一些命令,用于查看数据库、表、字段编码
1.查看数据库支持的所有字符集 show character set;或show char set; 2.查看当前状态 里面包括当然的字符集设置 status或者\s ...
- zzuoj 10407: B.最大岛屿
10407: B.最大岛屿 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 12 Solved: 5[Submit][Status][Web Board ...
- LCS算法
转自:http://hzzy-010.blog.163.com/blog/static/79692381200872024242126/ 好详细~~~也十分好理解~~~ 最长公共子序列问题(非连续的 ...
- kafka rebalance 部分分区没有owner
转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6234673.html 最近业务同学反馈kafka上线的时候某个topic的部分分区一直没有owner ...
- (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记
第五课: 1.UITextView @property (nonatomic, readonly) NSTextStorage *textStorage;//注意为只读属性,因此不能直接更改内容,NS ...
- Linux下源码安装Nginx服务
nginx 安装 linux 系统需要安装必备的开发包,比如 gcc,gcc-c++ 1. openssl (支持 https) https://www.openssl.org/source/ ...