WPF 自定义窗口

  在WPF中我们经常需要抛去windows自带的窗口的样式,设定一些自定义样式的窗口,这个时候我们需要设定 WindowStyle="None" 来移除windows自带的界面样式。除此之外我们还需要设定 AllowsTransparency ="True" 来让窗口支持透明的效果。

  这里分享一个 自定义窗口的demo,该demo实现的基本功能有:

  1. 实现自定义窗口的最小化、最大化、还原、关闭功能,默认为最大化;
  2. 最小化、最大化、还原、关闭按钮在捕获鼠标之后会有动画改变图片;
  3. 双击最上面的菜单栏也能实现窗口的最大化或者还原;
  4. 支持窗口在非最大化的情况下拖动,最大化后不能拖动;
  5. 窗口的最大化不会遮罩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:

  1. 窗口的最大化不会遮罩windows系统的任务栏,这里的话我们是先获取整个屏幕的工作区域大小,然后设定窗口最大化后的宽度和高度为工作区的大小。
  2. 为了共享按钮的MouseEnter及MouseLeave事件的动画,我们没在XAML中为每个按钮写动画,而是通过后台代码来实现。

最后附上demo百度云下载地址  请猛戳这里  密码: um7m

 

posted @ 2015-05-24 16:22  rpoplar  阅读(1354)  评论(1编辑  收藏  举报