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;
}
}

效果:





最新文章

  1. php和syslog
  2. 关于winform中*.exe.config中的appSettings的节点的读取与修改
  3. ie-css3.htc 可以让IE低版本浏览器支持CSS3 的一个小工具
  4. Android Studio开发入门-引用jar及so文件
  5. java类加载器
  6. 推荐一个linux下的web压力测试工具神器webbench
  7. kaili 2.0 metasploit连接postgres数据库
  8. 转:115个Java面试题和答案——终极列表(上)
  9. robots.txt文件配置和使用方法详解
  10. Hibernate逍遥游记-第5章映射一对多-02双向(&lt;set&gt;、&lt;key&gt;、&lt;one-to-many&gt;、inverse、cascade=&quot;all-delete-orphan&quot;)
  11. Pig简单入门
  12. Lucene/Solr开发经验
  13. ios从相册:摄像头中获取视频
  14. poj3620
  15. 《微信小程序七日谈》- 第七天:不要捡了芝麻丢了西瓜
  16. SQL SERVER之查询外键及索引
  17. 常见的数据扩充(data augmentation)方法
  18. 【EBook】-NO.161.微服务.1 -【微服务架构与实践】
  19. WIN10家庭版的升级到企业版
  20. 百度富媒体展示允许自定义站点Logo/简介等

热门文章

  1. EGADS介绍(二)--时序模型和异常检测模型算法的核心思想
  2. C++中流操作符&lt;&lt;重载的实现
  3. docker-理论题01
  4. 关于ucore实验一的资料查找
  5. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数
  6. Linux 驱动框架---驱动中的异步
  7. MobX All In One
  8. flutter sqlite持久化数据
  9. nasm astrlwr_s函数 x86
  10. 如何在ASP.NET Core中编写高效的控制器