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 ...
随机推荐
- (视频) 《快速创建网站》3.4 网站改版3分钟搞定 - WordPress主题安装和备份
本文是<快速创建网站>系列的第8篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...
- DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS
今天在测试.验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为 ...
- [20140722] forwarded和forwarding记录
背景: 今天被人文集forwarded和forwarding记录的事情. 简单介绍: 当堆表跟新某一个列的时候发现,不够放了,那么就在那行记录上标记forwarding,并把数据放到另外一个page, ...
- vs中不得不会的一些小技巧(1)——细说查找
最近在改公司里面古老的asp代码,不说文件有1w个,起码也有7,8千,而且文件里面include一个嵌套一个...当某天jira平台 上出现了需要你改的bug的时候,甚至都不知道这个错误在哪个页面,更 ...
- Storm系列(三):创建Maven项目打包提交wordcount到Storm集群
在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...
- top:failed tty get 错误
运行命令,ps -ef | grep test | grep -v test | awk '{ print $2 }' | xargs top -H -p 想看test的实时状态,结果报了错,查了一下 ...
- 七、Android学习第六天——SQLite与文件下载(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...
- hdfs 机架感知和复制因子的设置
dfs.replication 新更新的复制因子的参数对原来的文件不起作用. 譬如说,原来的复制因子是2,则原来文件上传的时候就只有两个副本. 现在把dfs.replication设置为3,重新启动h ...
- 准备使用 Office 365 中国版--邮箱迁移
微软产品一贯的作风是从来不缺文档和教程,Office 365也不例外.无论是最终用户还是企业IT管理员,都可参照Office 365使用指南顺利的开启Office 365之旅.不过比较奇怪的是,貌似很 ...
- 一次Mutex死锁的原因探究
1.现象 最近项目中调出一个bug,某些时候程序会卡死不动,用windbg进行加载后用 ~*kb 命令列出所有的线程栈调用,发现有多个线程调用 WaitForMultipleObjects 在等 ...