在WPF中我们经常需要抛去windows自带的窗口的样式,设定一些自定义样式的窗口,这个时候我们需要设定 WindowStyle="None" 来移除windows自带的界面样式。除此之外我们还需要设定 AllowsTransparency ="True" 来让窗口支持透明的效果。
这里分享一个 自定义窗口的demo,该demo实现的基本功能有:
- 实现自定义窗口的最小化、最大化、还原、关闭功能,默认为最大化;
- 最小化、最大化、还原、关闭按钮在捕获鼠标之后会有动画改变图片;
- 双击最上面的菜单栏也能实现窗口的最大化或者还原;
- 支持窗口在非最大化的情况下拖动,最大化后不能拖动;
- 窗口的最大化不会遮罩windows系统的任务栏;
最大化、及还原的代码:
1 if (isMaxSized) 2 { 3 this.Width = normalRect.Width; 4 this.Height = normalRect.Height; 5 this.Left = normalRect.Left; 6 this.Top = normalRect.Top; 7 this.WindowState = WindowState.Normal; 8 this.isMaxSized = false; 9 btn.Tag = "maxSize"; 10 } 11 else 12 { 13 normalRect = new Rect(this.Left, this.Top, this.ActualWidth, this.ActualHeight); 14 Rect rc = SystemParameters.WorkArea; 15 this.Width = rc.Width; 16 this.Height = rc.Height; 17 this.Left = 0; 18 this.Top = 0; 19 this.isMaxSized = true; 20 btn.Tag = "normalSize"; 21 }
切换图片路径的动画代码:
1 var objKeyFrames = new ObjectAnimationUsingKeyFrames(); 2 objKeyFrames.Duration = TimeSpan.FromMilliseconds(100); 3 objKeyFrames.KeyFrames.Add(new DiscreteObjectKeyFrame 4 { 5 Value = new BitmapImage(new Uri(imgUrl, UriKind.Relative)) 6 }); 7 Storyboard story = new Storyboard(); 8 Storyboard.SetTarget(story, img); 9 Storyboard.SetTargetProperty(story, new PropertyPath(Image.SourceProperty)); 10 story.Children.Add(objKeyFrames); 11 story.Begin();
PS:
- 窗口的最大化不会遮罩windows系统的任务栏,这里的话我们是先获取整个屏幕的工作区域大小,然后设定窗口最大化后的宽度和高度为工作区的大小。
- 为了共享按钮的MouseEnter及MouseLeave事件的动画,我们没在XAML中为每个按钮写动画,而是通过后台代码来实现。
最后附上demo百度云下载地址 请猛戳这里 密码: um7m