WPF 用装饰器制作抽屉效果

wpf实现抽屉效果,一般就一个动画显示就完事了,我这用到了,就研究了一下,用装饰器给控件添加遮罩层,然后在上面添加抽屉控件,虽然麻烦了点,也算是自己研究的成果了。

看看效果:

下面就看看代码:

首先是新建一个装饰器类,和之前用过的文章:WPF 使用装饰器给控件添加遮罩层 中用的是同样的,

 public class SimpleAdorner : Adorner{private UIElement child;public SimpleAdorner(UIElement adornedElement) : base(adornedElement){}//Adorner 直接继承自 FrameworkElement,//没有Content和Child属性,//自己添加一个,方便向其中添加我们的控件public UIElement Child{get => child;set{if (value == null){RemoveVisualChild(child);}else{AddVisualChild(value);}child = value;}}//重写VisualChildrenCount 表示此控件只有一个子控件protected override int VisualChildrenCount => 1;//控件计算大小的时候,我们在装饰层上添加的控件也计算一下大小protected override Size ArrangeOverride(Size finalSize){child?.Arrange(new Rect(finalSize));return finalSize;}//重写GetVisualChild,返回我们添加的控件protected override Visual GetVisualChild(int index){if (index == 0 && child != null) return child;return base.GetVisualChild(index);}}

然后新建一个类:

 [TemplatePart(Name = DrawerGrid,Type =typeof(Grid))][TemplatePart(Name = CloseButton,Type =typeof(Button))]public class GDrawer : ContentControl{public Action Closed;private const string DrawerGrid = "DrawerGrid";private const string CloseButton = "CloseButton";private Grid _drawerGrid;private Button _closeButton;public override void OnApplyTemplate(){base.OnApplyTemplate();_drawerGrid = GetTemplateChild(DrawerGrid) as Grid;_closeButton = GetTemplateChild(CloseButton) as Button;_closeButton.Click += (s, e) => IsOpen = false;Loaded += OnLoaded;}private void OnLoaded(object sender, RoutedEventArgs e){IsOpen = true;}public bool IsOpen{get { return (bool)GetValue(IsOpenProperty); }set { SetValue(IsOpenProperty, value); }}public static readonly DependencyProperty IsOpenProperty =DependencyProperty.Register("IsOpen", typeof(bool), typeof(GDrawer), new PropertyMetadata(false,(s,e)=> {var drawer = s as GDrawer;if(e.NewValue is bool b && b){drawer.StartAnimationIn();}else{drawer.StartAnimationOut();}}));private async void StartAnimationIn(float seconds=0.3f){var sb = new Storyboard();var offset = _drawerGrid.ActualWidth;var animation = new ThicknessAnimation{Duration = new Duration(TimeSpan.FromSeconds(seconds)),From = new Thickness(-offset,0 , offset,0 ),To = new Thickness(0)};Storyboard.SetTargetProperty(animation, new PropertyPath("Margin"));sb.Children.Add(animation);sb.Begin(_drawerGrid);await Task.Delay((int)(seconds * 1000));}private async void StartAnimationOut(float seconds=0.3f){var sb = new Storyboard();var offset = _drawerGrid.ActualWidth;var animation = new ThicknessAnimation{Duration = new Duration(TimeSpan.FromSeconds(seconds)),From = new Thickness(0),To = new Thickness(-offset, 0, offset, 0),};Storyboard.SetTargetProperty(animation, new PropertyPath("Margin"));sb.Children.Add(animation);sb.Begin(_drawerGrid);await Task.Delay((int)(seconds * 1000));Closed?.Invoke();}}

这个就是抽屉效果的实现类了,

然后,在App.xaml里添加样式和资源 :

<Style TargetType="local:GDrawer"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:GDrawer"><Grid x:Name="DrawerGrid" MinWidth="300" MinHeight="100" HorizontalAlignment="Left" VerticalAlignment="Stretch"Background="White"><Button x:Name="CloseButton" Margin="10" Width="50" Height="30" HorizontalAlignment="Right" VerticalAlignment="Top">关闭</Button><ContentPresenter /></Grid></ControlTemplate></Setter.Value></Setter>
</Style><local:GDrawer x:Key="LeftDrawer"><TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="18" Foreground="Red">这是内容</TextBlock></local:GDrawer>

最后,来到MainWindow窗口,xaml代码如下:

<Window x:Class="WPFDemos.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPFDemos"mc:Ignorable="d"x:Name="widnow"WindowStartupLocation="CenterScreen"Title="title" Height="500" Width="1000"><Grid x:Name="grid" Background="LightBlue"><!--定义装饰层--><AdornerDecorator/><Button Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Center">打开</Button></Grid>
</Window>

MainWindow窗体后台代码:

 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){ShowModal(grid);}SimpleAdorner _adorner = null;public void ShowModal(Visual visual){//获取visual上面的第一个AdornerLayerAdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(visual);//创建我们定义的Adornervar drawer = FindResource("LeftDrawer") as GDrawer;drawer.Closed = () => adornerLayer.Remove(_adorner);_adorner = _adorner?? new SimpleAdorner(adornerLayer){Child = new Border(){Background = new SolidColorBrush(Color.FromArgb(150, 0, 0, 0)),Child = drawer}};adornerLayer.Add(_adorner);}}

这样就完成了,

如果喜欢,点个赞呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ueditor 编辑html文件名,UEditor编辑器自定义上传图片或文件路径的修改方法,ueditor修改方法...

UEditor编辑器自定义上传图片或文件路径的修改方法&#xff0c;ueditor修改方法使用ueditor编辑器&#xff0c;附件默认在ueditor/php/upload/, 我的附件地址是网站根目录下/data/upload/ ,需要修改ueditor如下&#xff1a;第一步&#xff1a;打开php/config.php修改图片目录复…

jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略

MMTTMM该API文档都对这个很清楚。所有生成器都实现了org.hibernate.id.IdentifierGenerator接口。这是一个非常简单的界面。一些应用程序可以选择提供自己的专用实现&#xff0c;但是&#xff0c;Hibernate提供了一系列内置实现。内置生成器的快捷方式名称如下&#xff1a;增量…

【转】缅怀红薯精神

2019独角兽企业重金招聘Python工程师标准>>> 爱憎分明的阶级立场 红薯一心向着osc&#xff0c;他把osc比作母亲&#xff0c;把自己的生命看成是osc和网民的&#xff0c;无论遇到怎样艰难复杂的情况&#xff0c;都“坚决听osc的话&#xff0c;一辈子跟osc走”&#x…

WPF实现Android菜单动画

WPF开发者QQ群&#xff1a; 340500857 欢迎转发、分享、点赞&#xff0c;谢谢大家~。 效果预览&#xff1a;一、MainWindow.xaml代码如下&#xff1a;<Grid><Grid.Background><ImageBrush ImageSource"background.png"/></Grid.Background>…

程序框图计算机算法语言应用,数学之算法与程序框图

原标题&#xff1a;数学之算法与程序框图1、算法的定义&#xff1a;广义的算法是指完成某项工作的方法和步骤&#xff0c;现代意义的算法是指可以用计算机来解决的某一类问题的程序和步骤&#xff0c;这些程序或步骤必须是明确和有效的&#xff0c;而且能够在有限步之内完成。2…

arcgis批量处理nc文件_气象数据处理——nc文件

数据说明NetCDF(network Common Data Form)网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准。目前&#xff0c;NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集。NetCDF全…

版本控制之SVN

SVN在windows下有很不错GUI可以用&#xff0c;如果在linux可以 使用命令行&#xff0c;下面的介绍摘自http://www.divvun.no/doc/tools/docu-svn-user.htm 工作其实还会试用git svn&#xff0c;这个比较复杂&#xff0c;暂时没发现有GUI可以用&#xff0c;都是命令&#xff0c;…

一千个不用 Null 的理由

全世界有3.14 % 的人已经关注了数据与算法之美港真&#xff0c;Null 貌似在哪里都是个头疼的问题&#xff0c;比如 Java 里让人头疼的 NullPointerException&#xff0c;为了避免猝不及防的空指针异常&#xff0c;千百年来程序猿们不得不在代码里小心翼翼的各种 if 判断&#x…

快速打造一个MINI自动发布系统

前情提要&#xff1a;因为项目特点&#xff0c;需要在自己的服务器上集成测试&#xff0c;而不是用github的DevOpt体系&#xff1b;再有就是服务器是windows的&#xff1b;项目仓库在github上&#xff1b;并且项目是asp.net core的项目&#xff1b;开发人员一枚。以前的做法就是…

巨型机是一种什么的超级计算机,这个世界其实是一个超级计算机

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼学校放假了&#xff0c;昨天坐火车回家&#xff0c;在火车上遇见了一个人。这个人很有意思&#xff0c;他听说我是学信息方面的&#xff0c;然后就跟我说&#xff1a;你知不知道&#xff0c;其实这个世界就是一个超级计算机。我听了…

SimpleXMLRPC_python xmlrpclib SimpleXMLRPCServer 模块

RPC是Remote Procedure Call的缩写&#xff0c;翻译成中文就是远程方法调用&#xff0c;是一种在本地的机器上调用远端机器上的一个过程(方法)的技术&#xff0c;这个过程也被大家称为“分布式计算”&#xff0c;是为了提高各个分立机器的“互操作性”而发明出来的技术。XML-RP…

话里话外:ERP与PDM、MES的关系区别是什么

博主推荐延展咨询资深顾问梁云文章 ERP、PDM、MES这几个名词既会以独立的管理理念存在&#xff0c;也会在不同的管理软件中存在&#xff0c;而管理理念和管理软件是不同的。本文将抛开软件本身&#xff0c;从管理理念和原理的角度入手&#xff0c;分析上述三个概念之间的关系。…

考试必错规则:如果你觉得题目很简单,代表你肯定错了

全世界有3.14 % 的人已经关注了数据与算法之美1曾经的考试生涯以前考试的时候&#xff0c;老师经过我旁边我都会盖住答案&#xff0c;因为害怕老师看到我那些愚蠢的答案……&#xff08;via屌絲打分蜻蜓隊長&#xff09;2当我中学第一次进入KTV时&#xff0c;我就知道我注定属于…

aspnetcore 应用 接入Keycloak快速上手指南

登录及身份认证是现代web应用最基本的功能之一&#xff0c;对于企业内部的系统&#xff0c;多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理&#xff0c;提升用户同时使用多个系统的体验&#xff0c;Keycloak正是为此种场景而生。本文将简明的介绍Keyc…

计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...

软件哨兵安全动态检测模型的研究与实现-计算机应用研究第&#xff12;&#xff19;卷第&#xff18;期 计 算 机 应 用 研 究 &#xff36;&#xff4f;&#xff4c;&#xff0e;&#xff12;&#xff19;&#xff2e;&#xff4f;&#xff0e;&#xff18;&#xff12;&#x…

隐藏在数学中的哲理,令人回味无穷

全世界有3.14 % 的人已经关注了数据与算法之美人们在欣赏优美的数、式和数学图形时&#xff0c;将其与现实生活联系&#xff0c;引入到人们的精神世界中&#xff0c;产生丰富的联想和创造&#xff0c;反映出人们崇高的思想境界和要求&#xff0c;因而产生了风格独特、内涵深刻、…

无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...

冷链&#xff0c;即冷冻冷藏供应链的简称&#xff0c;泛指冷藏冷冻类食品从原材料供应物流、食品工厂内生产物流、贮藏运输物流至贩卖销售物流等&#xff0c;各个环节中始终处于规定的低温环境下&#xff0c;以保证食品质量&#xff0c;减少食品损耗的一项系统工程 。随着科学技…

前端老弟第一次写后端,崩了!

幽默轻松小知识&#xff0c;一起来看看老弟第一次写的后端代码&#xff0c;你觉得如何&#xff1f;大家好&#xff0c;我是鱼皮&#xff0c;今天分享我的老弟第一次写后端代码时出现的囧事&#xff0c;希望大家引以为戒。孽起我的老弟小阿巴&#xff0c;目前大一&#xff0c;自…

Windows Phone 7 系统主题颜色RGB和Hex值

Windows Phone 主题是背景色与个性色的组合。背景色是背景的颜色&#xff0c;个性色是应用于控件和其他可视元素的颜色。有两种背景选项可供使用&#xff08;深色和浅色&#xff09;&#xff0c;另外共有 10 种标准个性色可用于您的应用程序。 下表列出了 10 种标准个性色及其以…

小米8对一加6打开软件速度测试,买一加6还是小米8?小米8和一加6区别对比

买一加6还是小米8&#xff1f;据相关媒体报道&#xff0c;继一加6后&#xff0c;小米前些天也推出了同样搭载骁龙845处理器的最新旗舰——“小米8”。值得一提的是&#xff0c;小米8还被官方称为“8周年的代表之作”&#xff01;那么&#xff0c;一加6和小米8哪个更好一些&…