控件分类
在第一篇文章
WPF App开发入门教程( 一、.Net Core/.NET和WPF介绍)
中的WPF的功能和特性部分根据功能性介绍了WPF的控件 名称。
在接下来的文章中,将会详细地介绍各个控件的概念及使用。
主要包括:
内容控件:Label、Button、CheckBox、ToggleButton、RadioButton、ToolTip和ScrollViewer
带有标题的内容控件:TabItem、GroupBox、Expander
导航控件:Frame、TabControl、Page
窗体控件:Window
文本控件:TextBox、PasswordBox、RichTextBox
列表控件:ListBox和ComboBox
基于范围的控件:Slider和ProgressBar
日期控件:Calender和DatePicker
媒体控件:Image和MediaElement
Window类
Window类继承自ContentControl类,也是内容控件的一种。在上一篇文章中,已经介绍过内容控件。
Window类比较特殊,它跟常规的内容控件不一样。除了额外的属性之外,它还是程序最顶级的元素。可以理解为Window类是WPF程序的最大的容器。所有的控件都是放置在Window类下。
在后面的文章中,会介绍到Application类。每个运行的程序,都由System.Windows.Application类的一个实例来表示。
Application类有一个Run函数,需要传入一个Window对象(或者通过StartupUri属性指定窗体,再调用无参Run函数)。通过调用Run函数,来启动整个WPF应用程序,并打开指定窗体。
常用属性
| 属性 | 说明 |
| Width |
|
| Height |
|
| WindowStyle | 使用WindowStyle枚举值, 设置窗体的边框类型。SingleBorderWindow(默认值)、 None(无边框,只显示内容区域,标题栏和边框都不显示)、 ToolWindow(固定工具窗口)、 ThreeDBorderWindow(具有三维边框的窗口) |
| AllowTransparency | 是否允许透明标志,默认false。 当设置为true,且背景被设置为透明色,整个窗体就会透明。 如果背景设置为透明色,AllowTransparency=false,就会显示黑色背景。 注意:AllowTransparency=true需要和WindowStyle=None配合使用,否则会报错。 这是因为边框不支持透明,只有无边框时,使用AllowTransparency=true才能生效。 |
| Icon |
|
| Left和Top |
|
| ResizeMode | 获取或设置调整大小模式,使用ResizeMode枚举值。 CanMinimize 只能最小化和还原窗口。 同时显示“最小化”和“最大化”按钮,但只有“最小化”按钮处于启用状态。
CanResize 可以调整窗口的大小。 同时显示“最小化”和“最大化”按钮,并且两个按钮均处于启用状态。
CanResizeWithGrip 可以调整窗口的大小。 同时显示“最小化”和“最大化”按钮,并且两个按钮均处于启用状态。 窗口的右下角显示一个大小调整手柄。
NoResize 无法调整窗口的大小。 标题栏中不显示“最小化”和“最大化”按钮。 |
| RestoreBounds |
|
| ShowInTaskbar |
|
| SizeToContent | 获取或设置一个值,该值指示窗口是否自动调整自身大小以适应其内容大小,使用SizeToContent枚举值。 Height 指定窗口将自动设置其高度以适合其内容的高度,而非宽度 Manual 指定窗口将如何自动设置其大小以适合其内容大小。 此外,窗口大小还可以由其他属性确定, 其中包括 Width、Height、MaxWidth、MaxHeight、MinWidth 和 MinHeight Width 指定窗口将自动设置其宽度以适合其内容的宽度,而非高度 WidthAndHeight 指定窗口将自动设置其宽度和高度以适合其内容的宽度和高度 |
| IsActive |
|
| Owner |
|
| ShowActivated |
|
| TaskbarItemInfo |
|
| Title |
|
| TopMost | 获取或设置一个值,该值指示窗口是否出现在 Z 顺序的最顶层。 当设置该属性为true时,窗口显示在应用程序其它窗口的上面。即最顶层 |
| WindowsStartupLocation | 获取或设置窗口首次显示时的位置。使用WindowsStartupLocation枚举值。 CenterOwner Window 的启动位置位于包含它的 Window 的中央,由 Owner 属性指定。 CenterScreen Window 的启动位置位于包含鼠标光标的屏幕的中央。 Manual 可从代码中设置 Window 的启动位置,或者使用默认的 Windows 位置。 |
| WindowState | 获取或设置一个值,该值指示窗口是处于还原、最小化还是最大化状态。 使用WindowState枚举值 Maximized 最大化窗口 Minimized 最小化窗口 Normal 还原窗口 |
| DialogResult | 获取或设置对话框结果值,此值是从 ShowDialog() 方法返回的值。 |
窗口组成
WPF窗口由两个不同的区域组成:
非工作区,用于托管窗口装饰,包括图标、标题、系统菜单、最小化按钮、最大化按钮、还原按钮、关闭按钮和边框。
一个工作区,用于托管特定于应用程序的内容。
下图显示了一个标准窗口:
显示窗口
显示窗口主要是调用Window类的Show()函数和ShowDialog()函数。
在程序启动时,WPF内部调用了MainWindow的Show函数。
当我们需要显示新的窗口时,可以有以下两种做法
1、使用Visual Studio 添加一个窗口
在XAML中对窗口进行布局
<Window x:Class="WindowDemo.XAMLWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WindowDemo"mc:Ignorable="d"Title="XAMLWindow" Height="450" Width="800"><Grid></Grid></Window>
显示窗体
XAMLWindow xAMLWindow = new XAMLWindow();xAMLWindow.ShowDialog();
或
XAMLWindow xAMLWindow = new XAMLWindow();xAMLWindow.Show();
2、直接使用代码创建窗口并显示
Window window = new Window();window.Width = 720;window.Height = 500;window.Background = Brushes.LightSkyBlue;window.Title = "Window 1";Grid grid = new Grid();Label label = new Label();label.HorizontalAlignment = HorizontalAlignment.Center;label.VerticalAlignment = VerticalAlignment.Center;label.Content = "Hello World";label.FontSize = 30;grid.Children.Add(label);window.Content = grid;window.ShowDialog();
Show()和ShowDialog的区别
Show():显示非模态窗口,非模态窗口不会阻止用户访问其它任何窗口。调用Show()函数,函数会立即返回。
ShowDialog():显示模态窗口(Modal),模态窗口会通过一种类似强制置顶的模式,锁住所有鼠标和键盘输入来阻止用户访问父窗口,直到模态窗口被关闭。在关闭模态窗口前,ShowDialog()函数也不会返回,这也就意味着后面的代码会被阻塞。
说明:
ShowDialog()函数会返回一个bool?值,代表Dialog的活动是被接受 (true) 还是被取消 (false)。 返回值是 DialogResult 属性在窗口关闭前具有的值。
像我们平常在调用各种对话框时,都会通过返回值来判断是否执行成功,如文件打开对话框
OpenFileDialog openFileDialog = new OpenFileDialog();if(openFileDialog.ShowDialog() == true){//操作选中的文件}
我们在自己设计一个对话框时,可以通过DialogResult属性来设置对话框的返回值,不管设置哪个值,对话框都会立即关闭并返回。
我们可以创建一个简单的窗口来试验一下
界面XAML
<Grid><Button Content="DialogResult = true" HorizontalAlignment="Center" VerticalAlignment="Top" IsDefault="True" Click="Button_Click"></Button><Button Content="DialogResult = false" HorizontalAlignment="Center" VerticalAlignment="Bottom" IsCancel="True" Click="Button_Click_1"></Button></Grid>
后台代码
private void Button_Click(object sender, RoutedEventArgs e){this.DialogResult = true;}private void Button_Click_1(object sender, RoutedEventArgs e){this.DialogResult = false;}
运行效果
关闭窗口
使用Close()函数可以关闭窗口。
如果我们只是想隐藏窗口,可以调用Hide()函数或设置Visibility属性为Hidden。不管使用哪种方式隐蔽窗口,代码依然会在后台执行。
有时候我们想在用户单击关闭按钮后,隐藏窗口,而不关闭窗口,可以在窗口的Closing事件中添加如下代码:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e){e.Cancel = true;//隐藏窗口、最小化窗口、创建托盘图标或其它操作}
像平常使用的微信软件就是在关闭后执行隐藏操作,而不是真正的退出。
窗口启动位置
可以通过设置Window.WindowStartupLocation属性指定第一次打开窗口时所要显示到的位置。
它的取值是WindowStartupLocation枚举类型,定义如下:
public enum WindowStartupLocation{Manual, //手动设置第一次启动位置CenterScreen, //屏幕中央CenterOwner //拥有者窗口中央}
Manual
窗口第一次启动时,显示在用户指定的位置。
当设置为Manual时,可以通过Window.Left属性和Window.Top属性来设置具体的启动位置。
Window.Left:窗口左边缘相对于桌面的位置
Window.Top:窗口上边缘相对于桌面的位置
如设置Left为80,Top为100,则启动位置如下图所示:
CenterScreen
窗口第一次启动时,显示在屏幕中央位置。
注意:这是第一次启动时的位置,在启动后,仍然可以通过Window.Left和Window.Top属性来修改窗口的位置
CenterOwner
窗口第一次启动时,显示在拥有者窗口的中央。
当设置为CenterOwner时,需要指定窗口的拥有者窗口
如下所示:
XAMLWindow xAMLWindow = new XAMLWindow();//设置XAMLWindow的拥有者为当前窗口xAMLWindow.Owner = this;//XAMLWindow的启动位置设置为当前窗口的中央xAMLWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;xAMLWindow.Show();
定位窗口
通过Width和Height属性,可以指定窗口的宽度和高度。
通过Left和Top属性,可以控制窗口距离屏幕边缘的位置。
有时候我们需要控制窗口的尺寸和位置,例如当窗口的大小会超过当前屏幕的分辨率的时候。
WPF提供了一个System.Window.SystemParamters类,SystemParamters类里面定义了大量的静态属性,可以用来快速查询系统设置,如屏幕大小、鼠标参数、键盘参数等。
如果我们想获取不带任务栏的屏幕大小,可以通过下面的方式
var width = SystemParameters.FullPrimaryScreenWidth;var height = SystemParameters.FullPrimaryScreenHeight;
如果我们想获取整个屏幕(主屏幕)的大小,可以通过下面的方式
var width = SystemParameters.PrimaryScreenWidth;var height = SystemParameters.PrimaryScreenHeight;
如果有多个显示器,想获取副屏(其它屏幕)的大小,可以通过下面的方式
//多个屏幕时System.Windows.Forms.Screen[] allScreen = System.Windows.Forms.Screen.AllScreens;//屏幕1的工作区域var firstScreenWorkingArea = allScreen[0].WorkingArea;var width = firstScreenWorkingArea.Width;var height = firstScreenWorkingArea.Height;
说明:
如果我们在窗口显示之后再去设置窗口的大小或位置,视觉效果上会看到窗口的改变。
窗口位置
针对窗口位置,可以在调用Show()或者ShowDialog()函数之前设置。
窗口大小
如果窗口的大小是已知且固定的,可以在调用Show()或者ShowDialog()函数之前设置。
如果窗口的大小是动态的,可以在窗口的Loaded事件处理函数中设置。
保存/还原窗口位置和大小
有时候我们需要记录窗口关闭前的位置和大小,以便下次启动时,恢复窗口原来的大小及位置。
我们可以在关闭时,将窗口的Left、Top、Width和Height属性值记录下来,保存到配置文件中。
在启动时,读取配置文件,将窗口恢复到原来的大小和位置。
在日常开发中,需要保存的参数可能远不止窗口位置和大小,如字体大小,界面参数等等,我们都可以用这种方式实现。
WPF提供了一套默认的应用程序设置,可以很方便的保存/读取设置。
说明:
这种方式是保存在资源文件中,无法通过记事本等文本编辑器直接编辑,正式项目推荐使用以XML/Json外部文件的形式保存。
使用默认应用程序设置的方法
1、打开项目的属性页,切换到设置选项卡
2、点击创建或打开应用程序设置,在这里我们可以添加不同类型的设置项。
添加一个System.Drawing.Size类型的值,用于记录窗口大小;
添加一个System.Drawing.Point类型的值,用于记录窗口的位置。
如下所示
3、在代码中使用设置项
关闭时
//使用RestoreBounds属性获取窗口在最小化或最大化之前的大小和位置var restoreBounds = this.RestoreBounds;Properties.Settings.Default.WindowPos = new System.Drawing.Point() { X = (int)restoreBounds.X, Y = (int)restoreBounds.Y };Properties.Settings.Default.WindowSize = new System.Drawing.Size() { Width = (int)restoreBounds.Width, Height = (int)restoreBounds.Height };//保存Properties.Settings.Default.Save();
启动时
var winSize = Properties.Settings.Default.WindowSize;var winPos = Properties.Settings.Default.WindowPos;if (winSize.Width != 0 && winSize.Height != 0){this.Left = winPos.X;this.Top = winPos.Y;this.Width = winSize.Width;this.Height = winSize.Height;}
运行效果
窗口的图标
通过Icon属性可以指定窗口的图标,它可以是来自外部文件、嵌入的资源,也可以是自己绘制的图像。
1、嵌入的资源
<Window ...Icon="logo.jpg"></Window>
2、外部文件
<Window ...Icon="D:\logo.jpg"></Window>
3、绘制的图像
<Window.Icon><DrawingImage><DrawingImage.Drawing>...</DrawingImage.Drawing></DrawingImage></Window.Icon>
窗口的边框样式
可以通过Window.WindowStyle属性设置窗口的边框样式,它是一个WindowStyle枚举类型,定义如下:
public enum WindowStyle{None, //无SingleBorderWindow, //单边框(默认值)ThreeDBorderWindow, //3-d 边框ToolWindow //固定的工具窗口}
各样式的显示效果如下:
说明:
1、当设置窗口允许透明,即AllowTransparency=true时,WindowStyle要设置为None,因为边框不支持透明,否则会报错。
2、Windows 10/11 22H2之前的版本可以通过Win32 API 函数SetWindowCompositionAttribute()设置带边框的窗口支持毛玻璃透明效果。如下所示
3、在后面创建不规则窗口时,也需要设置为WindowStyle为None
示例代码
https://github.com/zhaotianff/DotNetCoreWPF/tree/master/七、WPF中的常用控件(二)
参考资料
https://learn.microsoft.com/en-us/dotnet/api/system.windows.window

