又是玻璃效果?调用一句代码就OK了
原文 http://www.cnblogs.com/lan-mei/archive/2012/05/11/2495740.html
最近自学WPF,网上一查资料,全是依赖属性,路由事件,动画效果等等.....都不大那么易懂,还有各种小效果,像窗体的玻璃效果就很多,给的代码也是各种各样,一般都是依据一个窗体写的,别人想用的话要先看那些有用,在移植等等,为什么不把他写成一个类呢?最好大家调用一下类,点个方法就OK,毕竟很多时候开发想把写的那些都弄懂是不可能,一是时间不允许,二是能力有限....三是领导要的是效果.....
好了,直接上图了
当然,这个是白板,上面没有放东西.后台就重写了OnSourceInitialized方法,在加一句代码就OK了
- 1 protected override void OnSourceInitialized(EventArgs e)
- 2 {
- 3 base.OnSourceInitialized(e);
- 4 Glass.Load(this,new Thickness(-1));
- 5 }
其中的Glass就是主要的实现类了,你可以保存这个类,用的时候就重新一下OnSourceInitialized方法,在里面调用Load方法就好了,那个Thickness(-1)是什么意思呢?就是窗体的4个边框的距离了,-1就是整个窗体的意思,代码如下

- 1 class Glass
- 2 {
- 3 public static bool Load(Window _win)
- 4 {
- 5 return ExtendGlassFrame(_win, new Thickness(-1));
- 6 }
- 7
- 8 public static bool Load(Window _win, Thickness _margin)
- 9 {
- 10 return ExtendGlassFrame(_win, _margin);
- 11 }
- 12
- 13 [StructLayout(LayoutKind.Sequential)]
- 14 struct MARGINS
- 15 {
- 16 public MARGINS(Thickness t)
- 17 {
- 18 Left = (int)t.Left;
- 19 Right = (int)t.Right;
- 20 Top = (int)t.Top;
- 21 Buttom = (int)t.Bottom;
- 22 }
- 23 public int Left, Right, Top, Buttom;
- 24 }
- 25
- 26 [DllImport("dwmapi.dll", PreserveSig = false)]
- 27 static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
- 28
- 29 [DllImport("dwmapi.dll", PreserveSig = false)]
- 30 static extern bool DwmIsCompositionEnabled();
- 31
- 32 static bool ExtendGlassFrame(Window window, Thickness margin)
- 33 {
- 34 if (!DwmIsCompositionEnabled())
- 35 {
- 36 return false;
- 37 }
- 38 IntPtr hwnd = new WindowInteropHelper(window).Handle;
- 39 if (hwnd == IntPtr.Zero)
- 40 throw new InvalidOperationException("无法使用玻璃效果");
- 41 window.Background = System.Windows.Media.Brushes.Transparent;
- 42 HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
- 43 MARGINS margins = new MARGINS(margin);
- 44 DwmExtendFrameIntoClientArea(hwnd, ref margins);
- 45 return true;
- 46 }
- 47 }

咦,有人可能会说,你不是做了重载了吗?Thickness(-1)都包含进去了呀,是为了方便整个窗体调用的时候,直接传个this就OK了。的确,我想大多数时候要的都是整个窗体的效果,只要4个边的是比较少的,先看看效果吧,我们把上面OnSourceInitialized里面的Thickness参数换为
Thickness(22.2,33.3,44.4,55.5),没错,他是doule的,支持小数,就算你写个99.9999我也是没有意见的-,-
可以看到,中间没有设置到的就没有效果了.好像单调了一点,最后加个颜色的小动画吧

- 1 TextBlock textBlock = new TextBlock();
- 2 private void Window_Loaded(object sender, RoutedEventArgs e)
- 3 {
- 4 Grid grid = new Grid();
- 5 //定义颜色动画
- 6 ColorAnimation blackToWhite = new ColorAnimation(Colors.White, Colors.Black, new Duration(TimeSpan.FromSeconds(2)));
- 7 blackToWhite.AutoReverse = true;
- 8 blackToWhite.RepeatBehavior = RepeatBehavior.Forever;
- 9 //定义画笔,开始动画
- 10 SolidColorBrush scb = new SolidColorBrush(Colors.Black);
- 11 scb.BeginAnimation(SolidColorBrush.ColorProperty, blackToWhite);
- 12
- 13 textBlock.Text = DateTime.Now.ToString();
- 14 textBlock.FontSize = 30;
- 15 textBlock.TextEffects = new TextEffectCollection();
- 16
- 17 //定义文本效果
- 18 TextEffect tfe = new TextEffect();
- 19 tfe.Foreground = scb;
- 20 tfe.PositionStart = 0;
- 21 tfe.PositionCount = int.MaxValue;
- 22 textBlock.TextEffects.Add(tfe);
- 23 grid.Children.Add(textBlock);
- 24
- 25 //定义计时器
- 26 DispatcherTimer Mytimer = new DispatcherTimer();
- 27 Mytimer.Interval = TimeSpan.FromSeconds(1);
- 28 Mytimer.Tick+=new EventHandler(Mytimer_Tick);
- 29 Mytimer.Start();
- 30
- 31 this.AddChild(grid);
- 32 }
- 33
- 34 void Mytimer_Tick(object sender, EventArgs e)
- 35 {
- 36 textBlock.Text = DateTime.Now.ToString();
- 37 }
- 38
- 39 protected override void OnSourceInitialized(EventArgs e)
- 40 {
- 41 base.OnSourceInitialized(e);
- 42 Glass.Load(this);
- 43 }

直接用后台代码写的了,效果就直接运行了看吧,记住要加一些命名空间哦,还有引用那个Glass,当然你放在同级目录下就没有必要了
又是玻璃效果?调用一句代码就OK了的更多相关文章
- DWM 窗体玻璃效果实现
我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...
- iOS任何界面全屏炫酷倒计时,一句代码就够了
概述 iOS全屏炫酷倒计时,任何界面只需要调用一句代码就能实现,支持定制倒计时数字.倒计时结束时显示的文本.支持倒计时播放图片.开始倒计时和结束倒计时的block和delegate回调.支持定制文本颜 ...
- 【转】DWM 窗体玻璃效果实现
我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...
- 一句代码,更加优雅的调用KVO和通知
来源:wazrx 链接:http://www.jianshu.com/p/70b2503d5fd1 写在前面 每次使用KVO和通知我就觉得是一件麻烦的事情,即便谈不上麻烦,也可说是不方便吧,对于KVO ...
- 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果
原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...
- IOS 一句代码搞定启动引导页
前言引导页,一个酷炫的页面,自从微博用了之后一下就火起来了,对于现在来说一个app如果没有引导页似乎总显那么不接地气,那么为了让我们的app也“高大上”一次,我写了一个demo来实现启动引导页的实现, ...
- 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码
目录(?)[-] 官方文档 类装载 两种装载方法的区别 不同的类装载器 是否实例化类 在jdbc链接数据库中的应用 资源 原文地址:http://yanwushu.sinaapp.com/clas ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- ASP.NET 一句代码实现批量数据绑定
摘要:对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定.如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定,作者开发了的插 ...
随机推荐
- codeforces 519C.. A and B and Team Training
C. A and B and Team Training time limit per test 1 second memory limit per test 256 megabytes input ...
- webapi文档
webapi文档描述-swagger 最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员 ...
- MySQL load data infile
语法: load data [low_priority] [local] infile ‘file_path' [replace] [ignore] into table table_name [(c ...
- MYSQL 为表指定文件位置 data directory
背景知识: 如果表不指定文件位置,它会保存到 data/database_name/table_file;其中data在你指定的安装目录下,为了提高IO我们尽可能的 用到多个硬盘的IO能力,这个就需要 ...
- Android 自定义PopupWindow动画效果
public class RollActivity extends Activity { private View view; private Button btn; private PopupWin ...
- 在Eclipse中创建打开文件夹快捷键
Run 展开如下菜单: Run ---- External Tools ---- External Tools Configurations 在 program 下面新建一个工具 在 Location ...
- Node.js log3:create ejs engine and jade engine
The base condition is ensure that you have installed express. 1.create ejs engine Using windows d ...
- 让app在ios6上具有ios7的扁平效果
使用cocoapods在工程中加入UI7Kit,关于UI7Kit请自行google. 加入到工程 如果没安装cocoapods,则安装.(http://www.cocoapods.org) 安装方法: ...
- linux学习方法之六
相信不少想学习linux的新手们正愁不知道看什么linux学习教程好,下面小编给大家收集和整理了几点比较重要的教程,供大家学习,如需想学习更多的话,可到wdlinux学堂寻找更多教程. 1.linux ...
- public void Delete<T>(List<T> EntityList) where T : class, new() 这是什么意思
就是说T必须是一个类(class)类型,不能是结构(structure)类型. 这是类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct ...