WPF Adorner+附加属性 实现控件友好提示
标题太空泛,直接上图
无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做?
这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
例如WPF自带的控件上要加这样的效果,首先继承自原控件然后重写是可以的,但是控件类型太多,重写不过来。这个时候我们唯一能添加的只有附加属性了。
利用附加属性的属性变更事件PropertyChangedCallBack,我们可以获取到宿主对象即Button,然后就可以往Button上加入我们自定义的Adorner了。再添加一个附加属性控制Adorner的显示/隐藏,那么就很完美了,这样每个控件只用设置两个附加属性就能拥有上面的效果。下面是核心代码,
附加属性
- public class AdornerHelper
- {
- #region 是否有Adorner
- public static bool GetHasAdorner(DependencyObject obj)
- {
- return (bool)obj.GetValue(HasAdornerProperty);
- }
- public static void SetHasAdorner(DependencyObject obj, bool value)
- {
- obj.SetValue(HasAdornerProperty, value);
- }
- // Using a DependencyProperty as the backing store for HasAdorner. This enables animation, styling, binding, etc...
- public static readonly DependencyProperty HasAdornerProperty =
- DependencyProperty.RegisterAttached("HasAdorner", typeof(bool), typeof(AdornerHelper), new PropertyMetadata(false, PropertyChangedCallBack));
- private static void PropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- if ((bool)e.NewValue)
- {
- var element = d as Visual;
- if (element != null)
- {
- var adornerLayer = AdornerLayer.GetAdornerLayer(element);
- if (adornerLayer!=null)
- {
- adornerLayer.Add(new NotifyAdorner(element as UIElement));
- }
- }
- }
- }
- #endregion
- #region 是否显示Adorner
- public static bool GetIsShowAdorner(DependencyObject obj)
- {
- return (bool)obj.GetValue(IsShowAdornerProperty);
- }
- public static void SetIsShowAdorner(DependencyObject obj, bool value)
- {
- obj.SetValue(IsShowAdornerProperty, value);
- }
- // Using a DependencyProperty as the backing store for IsShowAdorner. This enables animation, styling, binding, etc...
- public static readonly DependencyProperty IsShowAdornerProperty =
- DependencyProperty.RegisterAttached("IsShowAdorner", typeof(bool), typeof(AdornerHelper), new PropertyMetadata(false,IsShowChangedCallBack));
- private static void IsShowChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var element = d as UIElement;
- if (element != null)
- {
- var adornerLayer = AdornerLayer.GetAdornerLayer(element);
- if (adornerLayer!=null)
- {
- var adorners = adornerLayer.GetAdorners(element);
- if (adorners != null && adorners.Count() != )
- {
- var adorner = adorners.FirstOrDefault() as NotifyAdorner;
- if (adorner == null)
- {
- return;
- }
- if ((bool)e.NewValue)
- {
- adorner.ShowAdorner();
- }
- else
- {
- adorner.HideAdorner();
- }
- }
- }
- }
- }
- #endregion
- }
然后是我们自定义的Adorner效果
- public class NotifyAdorner : Adorner
- {
- private VisualCollection _visuals;
- private Canvas _grid;
- private Image _image;
- public NotifyAdorner(UIElement adornedElement)
- : base(adornedElement)
- {
- _visuals = new VisualCollection(this);
- _image=new Image()
- {
- Source = new BitmapImage(new Uri("Notify.png",UriKind.RelativeOrAbsolute)),
- Width = ,
- Height =
- };
- _grid = new Canvas();
- _grid.Children.Add(_image);
- _visuals.Add(_grid);
- }
- public void ShowAdorner()
- {
- _image.Visibility = Visibility.Visible;
- }
- public void HideAdorner()
- {
- _image.Visibility = Visibility.Collapsed;
- }
- protected override int VisualChildrenCount
- {
- get
- {
- return _visuals.Count;
- }
- }
- protected override Visual GetVisualChild(int index)
- {
- return _visuals[index];
- }
- protected override Size MeasureOverride(Size constraint)
- {
- return base.MeasureOverride(constraint);
- }
- protected override Size ArrangeOverride(Size finalSize)
- {
- _grid.Arrange(new Rect(finalSize));
- _image.Margin=new Thickness(finalSize.Width-12.5,-12.5,,);
- return base.ArrangeOverride(finalSize);
- }
- }
这里是源码http://files.cnblogs.com/HelloMyWorld/AdornerSample.rar
大家看代码就能懂了
WPF Adorner+附加属性 实现控件友好提示的更多相关文章
- WPF 使用附加属性增加控件属性
使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...
- WPF Step By Step 控件介绍
WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子 ...
- 设置EditText控件中提示消息hint的字体颜色和大小
设置EditText控件中提示消息hint的字体颜色和大小 1.设置字体大小 代码例: public void init(){ hint= (EditText) findViewById(R.id.i ...
- WPF编程:textbox控件文本框数据显示最后一行
WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...
- 在WPF中使用WinForm控件方法
1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2. 在要使用WinForm控 ...
- CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)
事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...
- .Net中使用无闪刷新控件时提示框不显示
今天做提示框的时候一直不显示,让我郁闷好久,晚上吃饭的时候问了同事一下,他给了一个思路, 他说可能是因为由于页面中的无闪刷新导致的结果:百度了一下真找到了解决方法 在页面中存在无闪刷新控件的时候提示框 ...
- WPF中的image控件的Source赋值
WPF中的Image控件Source的设置 1.XAML中 简单的方式(Source="haha.png"); image控件的Source设置为相对路径后(Source=&quo ...
- WPF后台设置xaml控件的样式System.Windows.Style
WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵 http://3w.suchso.com/projecteac-tual/wpf-zhi ...
随机推荐
- 最新中国菜刀caidao-20160620下载和说明
0x00 中国制造, 黑客之刀 中国菜刀是中国安全圈内使用非常广泛的一款Webshell管理工具,此次老兵大牛进行了更新,界面更加优美,功能更加丰富,有图有真相! 0x01 验证 此次更新还自带了官网 ...
- C#中去掉表中重复的数据
/// <summary> /// 去掉表中重复的数据 int /// </summary> /// <param name="SourceTable&quo ...
- 十五天精通WCF——第九天 高级玩法之自定义Behavior
终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...
- SQLServer和Oracle创建视图用户
在数据集成的开发中,经常会需要给对方创建视图,让其可以查看一些必要的数据.既在数据库中创建用户,并赋给该用户查询视图的权限 一.SQLServer --创建登录用户账户USE [master] GO ...
- fopen()、 file_get_contents() 通过url获取链接内容
功能:获得网页内容 区别如下: fopen()打开URL 下面是一个使用fopen()打开URL的例子: <?php $fh = fopen('http://www.baidu.com/', ' ...
- IIS7配置PHP图解(转)
IIS7+PHP_5.2.17 于之前安装IIS的时候已经选上了isapi扩展和isapi筛选,这里就不用另外再添加角色服务了,直接开始 先修改php.ini文件.. 把c:\php下的php.ini ...
- Linux文件I/O
文件描述符(File Descriptor) a small, nonnegative integer for use in subsequent system calls (read(2), wri ...
- linux网站服务Apache+php+mysql的安装
1.挂载光盘 自己习惯将光盘挂载在/media/cdrom目录,在做本地yum源的时候此目录为默认目录之一 [root@localhost /]# mount /dev/cdrom /media/cd ...
- 地产cio揭秘:帆软大商业智能解决方案如何助力地产行业信息化
一. 地产行业信息化现状 房地产企业核心竞争能力的提升,需要强壮的企业运营管理能力,需要及时.准确.全面的业务数据分析作为参考与支撑.然而很多房地产企业缺乏能够集中体现企业运营活动状况的.全 ...
- Pairs Forming LCM(素因子分解)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/B 全题在文末. 题意:在a,b中(a,b<=n) ...