C# WPF 控件移动代码
前台代码,在窗体里加入了一个Button控件
<Window x:Class="DragMove.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DragMove"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Name="grid">
<Button Name="button"
Content="Drag Move This Button"
Height="30"
Width="160"/>
<Grid Width="50" Height="150">
<Canvas x:Name="canvas"
Height="50"
Width="50"
Background="Red"
MouseDown="c_MouseDown"
MouseMove="c_MouseMove"
MouseUp="c_MouseUp">
<TextBlock Text="123456"/>
</Canvas>
</Grid>
</Grid>
</Window>
后台代码
namespace DragMove
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Button控件在捕获了MouseLeftButtonDown事件后,会将该事件的“Handled”设置为true;
// 这个属性是用在事件路由中的,当某个控件得到一个RoutedEvent,就会检测Handled是否为true,为true则忽略该事件;
// 由于Button控件本身的Click事件,相当于将MouseLeftButtonDown事件抑制(Supress)掉了,转换成了Click事件;
// 所以,如果一定要使用这个事件的话,需要在初始化的函数里利用UIElement的AddHandler方法,显式的增加这个事件;
button.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonDown), true);
button.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonUp), true);
button.AddHandler(Button.MouseMoveEvent, new MouseEventHandler(this.Button_MouseMove), true);
}
#region button 移动代码
private void Button_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Button tmp = (Button)sender;
double dx = e.GetPosition(null).X - pos.X + tmp.Margin.Left;
double dy = e.GetPosition(null).Y - pos.Y + tmp.Margin.Top;
tmp.Margin = new Thickness(dx, dy, 0, 0);
pos = e.GetPosition(tmp);
}
}
Point pos = new Point();
private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Button tmp = (Button)sender;
pos = e.GetPosition(this.button);
this.button.CaptureMouse();
this.button.Cursor = Cursors.Hand;
}
private void Button_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Button tmp = (Button)sender;
tmp.ReleaseMouseCapture();
}
#endregion
#region canvas移动代码
Point mousePoint = new Point();
private void c_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
mousePoint = e.GetPosition(this.canvas);
canvas.CaptureMouse();
canvas.Cursor = Cursors.Hand;
}
}
private void c_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Canvas tmp = (Canvas)sender;
double dx = e.GetPosition(this.canvas).X - mousePoint.X + tmp.Margin.Left;
double dy = e.GetPosition(this.canvas).Y - mousePoint.Y + tmp.Margin.Top;
tmp.Margin = new Thickness(0, dy, 0, 0);
mousePoint = e.GetPosition(tmp);
}
}
private void c_MouseUp(object sender, MouseButtonEventArgs e)
{
this.canvas.ReleaseMouseCapture();
}
#endregion
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人