原文 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了的更多相关文章

  1. DWM 窗体玻璃效果实现

    我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...

  2. iOS任何界面全屏炫酷倒计时,一句代码就够了

    概述 iOS全屏炫酷倒计时,任何界面只需要调用一句代码就能实现,支持定制倒计时数字.倒计时结束时显示的文本.支持倒计时播放图片.开始倒计时和结束倒计时的block和delegate回调.支持定制文本颜 ...

  3. 【转】DWM 窗体玻璃效果实现

    我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...

  4. 一句代码,更加优雅的调用KVO和通知

    来源:wazrx 链接:http://www.jianshu.com/p/70b2503d5fd1 写在前面 每次使用KVO和通知我就觉得是一件麻烦的事情,即便谈不上麻烦,也可说是不方便吧,对于KVO ...

  5. 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果

    原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...

  6. IOS 一句代码搞定启动引导页

    前言引导页,一个酷炫的页面,自从微博用了之后一下就火起来了,对于现在来说一个app如果没有引导页似乎总显那么不接地气,那么为了让我们的app也“高大上”一次,我写了一个demo来实现启动引导页的实现, ...

  7. 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码

    目录(?)[-] 官方文档 类装载 两种装载方法的区别 不同的类装载器 是否实例化类 在jdbc链接数据库中的应用 资源   原文地址:http://yanwushu.sinaapp.com/clas ...

  8. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  9. ASP.NET 一句代码实现批量数据绑定

    摘要:对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定.如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定,作者开发了的插 ...

随机推荐

  1. ie8下的透明 问题

    团队里经常遇到,索性整理一起 是我们在前端开发中经常遇到的,在问题中经常遇到的两个问题是背景色透明和整体透明 先说下背景色透明,背景色透明,在现代浏览器中,可以用rgba颜色作为背景色. 简单介绍下r ...

  2. Train Problem II

    问题陈述: HDOJ Problem - 1023 问题解析: 卡特兰数(Catalan)的应用 基本性质: f(n) = f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2) ...

  3. static_cast与dynamic_cast转换 最简单的理解

    3.1 static_cast用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检 ...

  4. 定制化Azure站点Java运行环境(4)

    定制化使用您自己的Tomcat版本和JDK环境 在上面章节中,介绍了如何通过web.config,定制默认的Azure website的Java运行环境,默认情况下,Azure站点的Tomcat是7. ...

  5. iOS 开发者必知的 75 个工具

    你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将 ...

  6. linux下so动态库一些不为人知的秘密(中二)

    继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只 ...

  7. linux的7种运行级别<学习笔记>

    Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别 ...

  8. Python学习入门基础教程(learning Python)--5 Python文件处理

    本节主要讨论Python下的文件操作技术. 首先,要明白为何要学习或者说关系文件操作这件事?其实道理很简单,Python程序运行时,数据是存放在RAM里的,当Python程序运行结束后数据从RAM被清 ...

  9. PipedInputStream/PipedOutputStream原理

    PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进 ...

  10. IIS中如何建立FTP服务

    文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机.这些文件存储在运行 FTP 服务器软件的服务器计算机上.然后,远程计算机可以使用 FTP 建 ...