WPF 应用 - 拖拽窗体、控件
1. 拖拽窗体
使用 System.Windows.Window 自带的 DragMove() 方法即可识别窗体拖动。
DragMove();
2. 拖拽控件:复制、移动控件
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
<Grid.Resources>
<Style TargetType="Rectangle">
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="20"/>
<Setter Property="Margin" Value="10"/>
</Style>
</Grid.Resources>
<Border Grid.Column="0" BorderBrush="LightSkyBlue" BorderThickness="2" MouseLeftButtonDown="Add_MouseLeftButtonDown">
<StackPanel x:Name="sp">
<Rectangle Fill="#FF113355"/>
<Rectangle Fill="#FF33AA77"/>
<Rectangle Fill="#FFBB2200"/>
<Rectangle Fill="#FFDD0077"/>
</StackPanel>
</Border>
<Border Grid.Column="1" BorderBrush="LightSkyBlue" BorderThickness="2" MouseLeftButtonDown="Move_MouseLeftButtonDown">
<Canvas x:Name="cav">
</Canvas>
</Border>
</Grid>
...
public partial class VisualWindow : Window
{
public VisualWindow()
{
InitializeComponent();
}
Rectangle SelectedRect { get; set; }
/// <summary>
/// 如果点击右侧可新增的矩形,则右侧 Canvas 将新增一个矩形
/// </summary>
private void Add_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point point = e.GetPosition(this.sp);
if (e.Source.GetType() != typeof(Rectangle)) return;
InitRectangle((Rectangle)e.Source);
this.cav.Children.Add(SelectedRect);
this.MouseMove += VisualWindow_MouseMove;
this.MouseLeftButtonUp += VisualWindow_MouseLeftButtonUp;
}
/// <summary>
/// 将 SelectedRect 指向一个新的 Rectangle
/// </summary>
private void InitRectangle(Rectangle rect)
{
SelectedRect = new Rectangle();
SelectedRect.Width = rect.Width;
SelectedRect.Height = rect.Height;
SelectedRect.Fill = rect.Fill;
SelectedRect.Opacity = 0;
}
/// <summary>
/// 如果目标被拖入指定区域,opacity 设为 0.5,并跟随鼠标,直到鼠标释放或鼠标离开指定区域
/// </summary>
private void VisualWindow_MouseMove(object sender, MouseEventArgs e)
{
if (SelectedRect == null) return;
Point point = e.GetPosition(this.cav);
if (point.X < 0 || point.Y < 0)
{
SelectedRect.Opacity = 0;
return;
}
SelectedRect.Opacity = 0.5;
Canvas.SetLeft(SelectedRect, point.X - SelectedRect.Width / 2);
Canvas.SetTop(SelectedRect, point.Y - SelectedRect.Height / 2);
}
/// <summary>
/// 如鼠标离开指定区域(这里可以简单以 SelectedRect.Opacity == 0 作为标记),则移除刚新增的矩形
/// 如鼠标在指定区域释放,则将新增的矩形停在鼠标释放的位置
/// </summary>
private void VisualWindow_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Point point = e.GetPosition(this.cav);
bool isMouseOutOfCav = point.X < 0 || point.Y < 0;
if (SelectedRect != null && isMouseOutOfCav)
{
this.cav.Children.Remove(SelectedRect);
}
SelectedRect.Opacity = 1;
this.MouseMove -= VisualWindow_MouseMove;
this.MouseLeftButtonUp -= VisualWindow_MouseLeftButtonUp;
}
/// <summary>
/// 移动矩形
/// </summary>
private void Move_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.Source.GetType() != typeof(Rectangle)) return;
SelectedRect = (Rectangle)e.Source;
this.MouseMove += VisualWindow_MouseMove;
this.MouseLeftButtonUp += VisualWindow_MouseLeftButtonUp;
}
}
效果:



WPF 应用 - 拖拽窗体、控件的更多相关文章
- ios 为什么拖拽的控件为weak 手写的strong
ib拖拽的控件自动声明为weak 而平时自己手写的为strong 在ios中,对象默认都是强引用,不是强引用赋值后会立即释放 ib声明weak 不立即被释放 简单说就是 1.声明的弱引用指向强引用 ...
- swift方法 的写法,ui上拖拽的控件到controller里面的方法
直接点xcode右上角三个按键中间一下,左右拆分为storyboard和controller, 点击button,按ctrl,然后拖拽到controller里面即可生成对应的点击事件在controll ...
- C# WPF可拖拽的TabControl
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF可拖拽的TabControl 阅读导航 本文背景 代码实现 本文参考 源码 1. ...
- Winfon 页签切换及窗体控件自适应
由于公司的业务调整,最近不仅开发bs,还有不熟悉的cs,人手也不足,项目还多,对于cs来说,算是小白,虽然是一个人,也是硬着头皮写,拖拽控件,自定义控件.一个项目下来,对cs有了很深的认识,这里好好感 ...
- WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
Windows Community Toolkit 再次更新到 5.0.以前可以在 WPF 中使用有限的 UWP 控件,而现在有了 WindowsXamlHost,则可以使用更多 UWP 原生控件了. ...
- C#窗体控件拖动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- WPF 使用鼠标拖动一个控件的实现[2018.7.15]
原文:WPF 使用鼠标拖动一个控件的实现[2018.7.15] Q:已经把一个Shape和一个TextBlock组合起来放到了一个Grid中,现在想要实现用鼠标拖动这个Grid到任意位置的功能,如何做 ...
- .NET成人礼 | 还记得20年前一起拖过的控件吗?
本文是MVP Ediwang写的回忆一个80后的拖控件的感悟,与君共勉: 每一代人都有记忆里的味道.煤球炉.黑白电视机是属于父母的记忆.而“拖控件”式编程,启蒙了无数像我这样的80后(嗯,89也算80 ...
- C# winform 跨线程更改窗体控件的属性
当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textb ...
随机推荐
- [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历
目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...
- 二进制安装kubernetes(二) kube-apiserver组件安装
根据架构图,我们的apiserver部署在hdss7-21和hdss7-22上: 首先在hdss7-200上申请证书并拷贝到21和22上: 创建证书文件: # cd /opt/certs # vi c ...
- Hexo-使用阿里iconfont图标
Hexo-使用阿里iconfont图标 因为使用hexo搭建的博客中,大家并不懂都有什么图标,fa fa-xx就懵了,不知道都有什么. 首先,fa fa-xxx中的图标可以在 图标库 中寻找. (上面 ...
- Lightoj 1038 - Race to 1 Again【期望+dp】
题目:戳这里 题意:一个数字n不断迭代地除以自身的因子得到1.求这个过程中操作除法次数的期望. 解题思路: 求概率基本都是从一个最基础的状态开始延伸推出公式,得出答案.因为每个数都有个共同的最终状态1 ...
- PAT L2-005. 集合相似度 【stl set】
给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...
- Dos简单命令及CMD打开方式
打开CMD方式 开始+系统+命令提示符 WIN健+R 输入cmd打开控制台(推荐使用) 在任意文件夹下面,按住shift+鼠标右击,进入powershell 资源管理器的地址栏路径最前面+cmd+空格 ...
- μC/OS-III---I笔记12---任务管理
任务管理任务切换应该算是UCOS最基本的部分,首先保存当前任务寄存器的内容到当前任务的堆栈:接着弹出即将进行的任务的堆栈内容到寄存器中然后就是按寄存器内容执行,这个过程成为上下文切换.任务堆栈在创建任 ...
- js中当for循环中有事件要使用循环变量时,变量用var声明和let声明的区别
var 声明一个全局变量,声明的变量会变量提升: let 声明一个局部变量: 当页面加载完后,for循环也结束了,如果用var声明的变量此时也随着for循环的结束而自增到满足结束循环的条件, 此时调用 ...
- Github App version released icons
# Github App version released icons http://shields.io/ Build Travis: https://img.shields.io/travis/U ...
- prototype chain & prototype & __proto__
prototype chain & prototype & proto prototype chain MDN https://developer.mozilla.org/en-US/ ...