博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF Adorner
阅读量:6929 次
发布时间:2019-06-27

本文共 3064 字,大约阅读时间需要 10 分钟。

原文:

之前做项目时,为了实现类似微信消息数目的效果

 
image.png

 

,我之前是修改的ControlTemplate。类似于将一个带数字的控件,放在另一个控件的右上角,来实现的这个效果。

原来WPF有个Adorner,也可以实现这样的效果。
WPF中很多控件,都带Adorner层。这相当于一个控件的装饰层。我们在这里面可以做出很多蛮好的效果。比如错误提示等。
我们要实现上图的那种效果,我们可以做一个附加属性。

public static bool GetShowAdorner(DependencyObject obj)    {        return (bool)obj.GetValue(ShowAdornerProperty);    }    public static void SetShowAdorner(DependencyObject obj, bool value)    {        obj.SetValue(ShowAdornerProperty, value);    }            public static readonly DependencyProperty ShowAdornerProperty =        DependencyProperty.RegisterAttached("ShowAdorner", typeof(bool), typeof(MainWindow), new PropertyMetadata(false, Method));    private static void Method(DependencyObject d, DependencyPropertyChangedEventArgs e)    {        var ele = d as Visual;        var adolay = AdornerLayer.GetAdornerLayer(ele);        if (adolay != null)        {            var ados = adolay.GetAdorners(ele as UIElement);            if (ados == null)            {                adolay.Add(new KDAdorner(ele as UIElement));            }            ados = adolay.GetAdorners(ele as UIElement);            if (ados != null && ados.Count() != 0)            {                var ado = ados.FirstOrDefault() as KDAdorner;                if ((bool)e.NewValue)                {                    ado.ShowImage();                }                else                {                    ado.HideImage();                }            }        }

 

继承Adorner,实现我们想要的Adorner效果

public class KDAdorner : Adorner    {        private VisualCollection _visuals;        private Canvas _grid;        private Border _br;        public KDAdorner(UIElement ele)            : base(ele)        {            _visuals = new VisualCollection(this);            _br = new Border ();            _br.CornerRadius= new CornerRadius (50);            _br.Background = Brushes.Red;            TextBlock _txt = new TextBlock();            _txt.Text = "4";            _txt.Width=_txt.Height = 20;            _txt.Foreground = Brushes.White;            _txt.TextAlignment = TextAlignment.Center;            _br.Child = _txt;            _grid = new Canvas();            _grid.Children.Add(_br);            _visuals.Add(_grid);        }        protected override Visual GetVisualChild(int index)        {            return _visuals[index];        }        public void ShowImage()        {            _grid.Visibility = System.Windows.Visibility.Visible;        }        public void HideImage()        {            _grid.Visibility = System.Windows.Visibility.Hidden;        }        protected override Size ArrangeOverride(Size finalSize)        {            _grid.Arrange(new Rect(finalSize));            _br.Margin = new Thickness(finalSize.Width - 12.5, -12.5, 0, 0);            return base.ArrangeOverride(finalSize);        }        protected override int VisualChildrenCount        {            get            {                return _visuals.Count;            }        }    }

 

VIew中给需要添加Adorner效果的控件,添加附加属性

 

 
image.png

CheckBox绑定了Button的附加属性,我们可以通过IsChecked,控制Adorner层的显示,隐藏。

 

 
image.png

转载地址:http://ftkjl.baihongyu.com/

你可能感兴趣的文章
15天玩转redis —— 第三篇 无敌的列表类型
查看>>
网络工程实训_2路由器基本配置及IOS介绍
查看>>
form表单提交不成功提示
查看>>
PCL—综述—三维图像处理
查看>>
linux搭建https服务器(apache)
查看>>
XML 测验
查看>>
HTTP 错误405.0 - Method Not Allowed
查看>>
MIFARE系列7《安全》
查看>>
Qt工程转化为Vs工程
查看>>
剑指offer 例题
查看>>
Caffe学习系列(2):数据层及参数
查看>>
POJ1300(欧拉回路)
查看>>
Windows下cpu使用的监控
查看>>
怎样将baidu地图中的baidu logo 去掉
查看>>
WebService学习总结——调用第三方提供的webService服务
查看>>
设置vs2008代码区的背景色
查看>>
ServerSocket 默认邦定IP
查看>>
谈谈前端『新』技术
查看>>
(白书训练计划)UVa 120 Stacks of Flapjacks(构造法)
查看>>
删除反复字符
查看>>