博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Wpf 简单制作自己的窗体样式(2)
阅读量:6769 次
发布时间:2019-06-26

本文共 5047 字,大约阅读时间需要 16 分钟。

上一篇blog讲了制作简单的样式的窗体,对于一个传统的窗体,不仅仅可以拖动,和关闭操作、还具有最大化、最小化、隐藏,以及改变窗体的大小等。这篇blog就是对上篇的补充,完善窗体的改变大小和最大化最小化的功能。

1.改变形状窗体的尺寸
   实现的效果:在窗体的右下角,当鼠标划过时,改为可以拉动的鼠标样式,根据鼠标拖动的位置,修改窗体的大小。
上篇降到窗体分成两部分,head和content,在这里做一下修改,再增加一行footer,设置高度为5,用于放置一个元素,位置在右下侧,用于截获鼠标事件。
代码如下:
   <Grid Grid.Row="2" Background="White">
                <Border Height="5" Width="5" Background="White" CornerRadius="500,0,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" Cursor="SizeNWSE" MouseLeftButtonDown="Border_MouseLeftButtonDown" MouseLeftButtonUp="Border_MouseLeftButtonUp" MouseMove="Border_MouseMove">
                  
                </Border>
          
            </Grid>
其中Border就是用来专门截获鼠标事件的,当鼠标放置在此元素上时,鼠标状态改为可以拖动大小的图标。
在此元素上添加三个事件,鼠标左键按下,释放,和移动。
代码:
 //拖动改变窗体大小
        bool isWiden = false;
        private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            isWiden = true;
        }
 
        private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            isWiden = false;
            Border b = (Border)sender;
            b.ReleaseMouseCapture();
        }
 
        private void Border_MouseMove(object sender, MouseEventArgs e)
        {
            Border b = (Border)sender;
            if (isWiden)
            {
                b.CaptureMouse();
                double newWidth = e.GetPosition(this).X + 5;
                double newheight = e.GetPosition(this).Y + 5;
                if (newWidth > 0)
                {
                    this.Width = newWidth;
 
                }
                if (newheight > 0)
                {
                    this.Height = newheight;
                }
            }
 
 
        }
ok !修改窗体尺寸就实现了。
 
2.最大化、最小化
 
最小化的实现可以直接修改窗体的
WindowState=WindowState.Minimized;
如果直接修改窗体的 WindowState=WindowState.
Maximized;确实实现了窗体的最大化,但是存在一个问题,就是窗体的WindowStyle="None"的情况下,上面方式实现的最大化会覆盖系统的任务栏。
那就采用另一种简单的方式,根据活动区域的大小来设置窗体的高和宽,实现最大化的效果。
具体代码如下:
               Rect rc = SystemParameters.WorkArea;//获取工作区大小
               this.Left = 0;//设置位置
                this.Top = 0;
 
                this.Width = rc.Width;
                this.Height = rc.Height;
再次点击最大化按钮就会还原到窗体原来的大小和位置,在实现最大化之前需要纪录窗体当前的位置和大小。以便进行还原。
代码如下: 
rcnormal = new Rect(this.Left, this.Top, this.Width, this.Height);//保存下当前位置与大小
 this.Left = rcnormal.Left;
                this.Top = rcnormal.Top;
                this.Width = rcnormal.Width;
                this.Height = rcnormal.Height;
ok,到这里一个窗体基本有的功能都实现了。我在这里写下的只是一种实现方式,还有很多种可以去尝试。(参考WPF编程宝典(2010))
 
工程就不打包了,代码贴下:
XAML:
My window
View Code

后台:

 
///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            this.InitializeComponent();            // 在此点下面插入创建对象所需的代码。        }        private void Button_Click(object sender, RoutedEventArgs e)        {            this.Close();        }        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)        {            if (e.LeftButton == MouseButtonState.Pressed)            {                DragMove();            }        }        //拖动改变窗体大小        bool isWiden = false;        Rect rcnormal;//定义一个全局rect记录还原状态下窗口的位置和大小。        private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)        {            isWiden = true;        }        private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)        {            isWiden = false;            Border b = (Border)sender;            b.ReleaseMouseCapture();        }        private void Border_MouseMove(object sender, MouseEventArgs e)        {            Border b = (Border)sender;            if (isWiden)            {                b.CaptureMouse();                double newWidth = e.GetPosition(this).X + 5;                double newheight = e.GetPosition(this).Y + 5;                if (newWidth > 0)                {                    this.Width = newWidth;                }                if (newheight > 0)                {                    this.Height = newheight;                }            }        }        private void btnMin_Click(object sender, RoutedEventArgs e)        {            this.WindowState = WindowState.Minimized;        }        private void btnMaxOrMin_Click(object sender, RoutedEventArgs e)        {            Rect rc = SystemParameters.WorkArea;//获取工作区大小            if (this.Width == rc.Width)            {                this.Left = rcnormal.Left;                this.Top = rcnormal.Top;                this.Width = rcnormal.Width;                this.Height = rcnormal.Height;            }            else            {                rcnormal = new Rect(this.Left, this.Top, this.Width, this.Height);//保存下当前位置与大小                this.Left = 0;//设置位置                this.Top = 0;                this.Width = rc.Width;                this.Height = rc.Height;            }        }    }
View Code

 

 效果图:(鼠标放置在右下角,修改窗体尺寸)
 
 

转载于:https://www.cnblogs.com/Aeryoure/p/3307959.html

你可能感兴趣的文章
06-课堂问题总结归纳
查看>>
1009. 说反话 (20)
查看>>
css之position相对定位和绝对定位
查看>>
CSS - 盒子模型(下)
查看>>
Java温故而知新(7)Object类及其方法讲解
查看>>
在linux下PHP和Mysql环境搞事情
查看>>
bzoj2287【POJ Challenge】消失之物*
查看>>
字符串加密
查看>>
存储的瓶颈(5)
查看>>
nio原理/netty简单应用
查看>>
Vue.js 系列教程 1:渲染,指令,事件
查看>>
mysql 使用 FIND_IN_SET 来查询数据
查看>>
设置鼠标悬停图片放大效果
查看>>
要做个P2P应用,先收集点相关基于UDP可靠传输的资料
查看>>
jps & ps
查看>>
dtoj#4212. 小X爱旅行(travel)
查看>>
makefile学习笔记
查看>>
EF--DB First
查看>>
[你必须知道的.NET] 品味类型---从通用类型系统开始
查看>>
Computer Science - CS:APP - 2.1 信息存储
查看>>