Canvas布局下使用附加属性使控件岁鼠标移动
定义附加属性
public class MoveBehavior
{
public static readonly DependencyProperty IsMoveAbleProperty = DependencyProperty.RegisterAttached("IsMoveAble", typeof(bool),
typeof(MoveBehavior),new PropertyMetadata(false, OnEnableMoveChanged)); public static bool GetIsMoveAble(DependencyObject obj)
{
return (bool)obj.GetValue(IsMoveAbleProperty);
} public static void SetIsMoveAble(DependencyObject obj,bool value)
{
obj.SetValue(IsMoveAbleProperty, value);
}
public static void OnEnableMoveChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = d as FrameworkElement;
if (d!=null&& GetIsMoveAble(d))
{
element.PreviewMouseDown += Element_MouseDown;
element.PreviewMouseUp += Element_MouseUp;
element.PreviewMouseMove += Element_MouseMove;
}
} private static bool isCaptured = false;
private static void Element_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
var element = sender as FrameworkElement;
if (element == null) return;
var parent = VisualTreeHelper.GetParent(element) as FrameworkElement;
if (parent == null) return;
if (!isCaptured) return;
var p = e.GetPosition(parent);
Canvas.SetTop(element, p.Y - element.ActualWidth / 2);
Canvas.SetLeft(element, p.X - element.ActualHeight / 2);
} private static void Element_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isCaptured = false;
(sender as FrameworkElement).ReleaseMouseCapture();
} private static void Element_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isCaptured = true;
(sender as FrameworkElement).CaptureMouse();
}
}
使用如下:
<Canvas>
<Ellipse Width="50" Height="50" Fill="Red" x:Name="el"
local:MoveBehavior.IsMoveAble="True" ></Ellipse>
<Button local:MoveBehavior.IsMoveAble="False" Click="Button_Click_1" Content="Button" Canvas.Left="303.112" Canvas.Top="196.833" Width="75" Height="47.005"/>
</Canvas>
效果图:

Canvas布局下使用附加属性使控件岁鼠标移动的更多相关文章
- 实现TableLayout布局下循环取出TableRow控件中的文字内容到list集合
布局方式为TableLayout,利于实现表单样式展现. <!-- 详情内容区域 --> <ScrollView android:layout_above="@id/id_ ...
- Silverlight中在MVVM模式下对DatagridRow选择控件封装
在项目中,凡是涉及到表格的地方用的最多的控件,自然少不了DataGrid的身影,它明了的展示各种数据让人十分喜欢.现在要实现一个功能,使DataGrid具有全选和项选中的功能,如果在传统后台代码中完成 ...
- WPF 使用附加属性增加控件属性
使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...
- 如何写一套下拉刷新的控件?《MJRefresh原理浅析》(附Demo下载地址)
相信大家有很多人在做项目的时候都在使用MJRefresh 控件来实现下拉刷新的功能: MJRefresh经过不断的重构与更新迭代,现在不管是功能上还是代码结构上都是相当不错的,都是很值我们去学习的. ...
- Delphi下使用Oracle Access控件组下TOraSession控件链接
Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用 orsn1.Options.Direct:=true; orsn1.Server:=IP:Port: ...
- Android 在布局容器中动态添加控件
这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...
- cocos2d-html5 简易 下拉表单 控件
刚才在CH5的群里问了问 有没有大侠写过 下拉表单控件啊! 没人鸟窝 ,DZ老师表示非常伤心啊 ,于是乎 自己写一个把 共享给大家. 效果图上一个 仅仅实现了一个最最主要的控件 非常eas ...
- Asp.Net2.0下C#环境 Login控件实现用户登录
原文:Asp.Net2.0下C#环境 Login控件实现用户登录 一.前台显示效果 二.前台代码 <asp:Login ID="Login1" run ...
- Atitit.ui控件---下拉菜单选择控件的实现select html
Atitit.ui控件---下拉菜单选择控件的实现select html 1. 调用& model的实现 1 2. -----select.jsp------ 1 1. 调用& m ...
- [RN] React Native 仿美团下拉筛选菜单控件
React Native 仿美团下拉筛选菜单控件 演示效果如下: 使用方法如下: 1.安装 npm install react-native-dropdownmenus --save react-na ...
随机推荐
- VS保存后Unity不刷新
目录 问题:Visual Studio写完代码保存好,Unity不会重新编译 三种解决方案 1.先选为默认.重启Unity.更改为想要的代码编写软件. 2.查看Auto Refresh是否开启 3. ...
- 如何在阿里云服务器搭建flask
下载flask不用我多说了,pip3 install flask 今天在阿里云的服务器上测试一个Flask程序,命名指定了 ip:0.0.0.0,port:5000,但是外网IP确怎么也访问不了网页 ...
- vue3 | slots
一.什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML.组件等,填充的内容 ...
- MySQL-SQL语法、字段类型
1.字符编码与配置文件 1.\s:查看当前MySQL相关信息:当前用户.版本.编码.端口号. """ Server characterset.Db characterse ...
- 详解Redisson分布式限流的实现原理
摘要:本文将详细介绍下RRateLimiter的具体使用方式.实现原理还有一些注意事项. 本文分享自华为云社区<详解Redisson分布式限流的实现原理>,作者: xindoo. 我们目前 ...
- c++标准库string的使用完美总结——十分详细,复习学习记忆都可以使用
std::string详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足 ...
- JavaScript原型和原型链?有什么特点?
一.原型 JavaScript 常被描述为一种基于原型的语言--每个对象拥有一个原型对象 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上 ...
- JZOJ 2937. 【NOIP2012模拟8.9】监听还原
题面 分析 注意读题 然后显然字符串哈希 \(Code\) #include<cstdio> #include<cstring> using namespace std; ty ...
- Ubuntu20.04桌面系统快速上手教程
转载csdn:ChunKai93 https://blog.csdn.net/iamzhoujunjia/article/details/105349441
- Jquery 点击弹窗,将弹窗内容赋值到各个项demo
<div class="qb"> <div class="box"> <div class="qtt f_16 fbd& ...