又是玻璃效果?调用一句代码就OK了
最近自学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,当然你放在同级目录下就没有必要了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!