Window、UserControl(用户控件,布局时向窗体那样布局即可)和Page把窗体一网页形式展现。一个XAML页面中只能有一个顶级元素,而顶级元素种只能有一个子元素,所以需要布局控件。
WPF中默认的窗口框架的外观主要取决于Icon、Title、WindowStyle、ResizeMode等属性。其中Icon属性指定窗口的图标,Title属性指定窗口的标题,WIndowStyle属性指定窗口的样式,ResizeMode属性可以指定大小调节样式。且,WindowStyle属性有4个属性值,分别是无边框的None值、单边框且为默认值的SingleBorderWindow值、3D边框的ThreeDBorderWindow值,和工具箱窗口的ToolWindow值。ResizeMode也有着4个属性值,分别是不可调节,同时没有最大最小按钮的NoResize值、不可调节,但可以最小化且最大化按钮不可用的CanMinimize值、可调节且为默认属性值的CanResize值和可根据网格调节的CanResizeWidthGrip值。
WindowStartupLocation属性可以指定窗口初始位置,且,它有3个属性值:Manual(手动指定位置,表示可以通过设置其Top、Left属性值来决定窗口的初始位置)、CenterScreen(位于屏幕中央)和CenterOwner(位于父窗体中央)。
TopMost属性可以调节窗口的前后顺序,属性值为true时,窗口位于最上方,也位于TopMost属性值为false的窗口上方,若TopMost属性值皆为true,则获得焦点的窗口在最上方。
Width和Height分别表示窗口的宽度和高度,被称作“尺寸属性”。而MaxWidth、MinWidth、MaxHeight和MinHeight分别表示窗口的最大宽度、最小宽度、最大高度和最小高度,我们可以通过得到和更改这些属性值来获取和改变窗口的大小和长宽范围。ActualWidth和ActualHeight分别表示窗口的实际宽度和实际高度,被称作“实际尺寸属性”。实际尺寸属性是根据当前窗口大小、最小化时窗口大小和最大化时窗口大小来计算得到的,它的值时制度的,不能通过改变ActualWidth和ActualHeight的值来更改窗口大小。
SizeToContent表示窗口大小由内容决定,由4个属性值:Manual(手动设置。默认值)、Width(窗体宽度由内容决定)、Height(窗体高度由内容决定)和WidthAndHeight(窗体大小由内容决定),如果内容尺寸超过了窗口最大或最小的范围,还是以最大/最小范围为主。如果手动制定了窗口的Width和Height属性,那么SizeToContent属性将被忽略。
Visibility属性设置窗口可见性,拥有4个枚举值:Visible(可见)、Hidden(隐藏)和Collapsed(折叠),窗口类虽然认为Collapsed于Hidden一样,但两者的区别在于Hidden仅仅能将元素设为不可见,但元素在画布上人就占有自己的面积,而Collapsed再不可视的基础上能将元素再画布上的站位符清楚,使元素彻底不影响画面。此外,我们还有Show和Hide两个方法可以显示和隐藏窗口。如果窗口的ShowlnTaskbar属性的值为true,那么Hide不但可以隐藏窗口本身,同时还能隐藏它在任务栏上的图标。
WindowState属性可以设置窗口状态属性,也拥有3个枚举值,分别是Normal(正常)、Maxmized(最大化)和Minmized(最小化)。
RestoreBounds属性可以获取窗口在最小化或最大化之前的大小和位置,它拥有4个枚举值,分别是上Top、左Left、宽Width和高Height。
比如;
//输出当前窗口的RestoreBounds值
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(this.RestoreBounds.ToString());
}
只有窗口在Normal状态下移动或调整时,RestoreBuounds的值才会改变,我们可以在窗口关闭时将RestoreBounds的属性值保存到配置文件中,下一次启动程序窗口时,读取上次保存的窗口大小、位置、位置来初始化窗口,以此实现保存用户配置等功能。
获取窗口在最小化或最大化之前的大小和位置:
//属性值:Rect。一个 Rect,指定窗口在最小化或最大化之前的大小和位置。
public System.Windows.Rect RestoreBounds { get; }
使用 RestoreBounds 和独立存储来确保窗口的大小和位置与上一次显示窗口时的大小和位置相同:
XAML:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowRestoreBoundsSnippets"
Closing="MainWindow_Closing">
C#:
using System;
using System.ComponentModel;
using System.IO;
using System.IO.IsolatedStorage;
using System.Windows;
namespace WpfApplication1
{
///
/// Window1.xaml 的交互逻辑
///
public partial class Window1 : Window
{
string filename = "settings.txt";
public Window1()
{
InitializeComponent();
// 刷新从先前打开的窗口恢复边界
IsolatedStorageFile storage =
IsolatedStorageFile.GetUserStoreForAssembly();
try
{
using (IsolatedStorageFileStream stream = new
IsolatedStorageFileStream(this.filename, FileMode.Open, storage))
using (StreamReader reader = new StreamReader(stream))
{
// 从文件中读取恢复边界值
Rect restoreBounds = Rect.Parse(reader.ReadLine());
this.Left = restoreBounds.Left;
this.Top = restoreBounds.Top;
this.Width = restoreBounds.Width;
this.Height = restoreBounds.Height;
}
}
catch (FileNotFoundException ex)
{
// 当文件在独立存储中找不到时,句柄:
// * 这是第一次应用程序会话
// * 文件已被删除
}
}
private void MainWindow_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
// 保存restore bounds,以便下次打开此窗口时使用
IsolatedStorageFile storage =
IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream = new
IsolatedStorageFileStream(this.filename, FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
// 写恢复边界值到文件
writer.WriteLine(this.RestoreBounds.ToString());
}
}
}
}
还原矩形是窗口在最小化或者最大化之前占用的区域。在应用程序关闭之前,可以使用RestoreBounds来保存窗口的最后一个大小和位置,并且在下次应用程序启动时检索这些值,以将窗口还原到用户离开它的方式,如果在显示窗口之前或者在窗口关闭之后RestoreBounds查询,则返回Empty。
关于各事件:
Initialized:当窗口的FrameworkElement底层初始化时触发,也就是InitializeComponent方法调用时触发。
LocationChanged:窗口被移动时触发。
Activated:窗口被激活时触发。
Deactivated:窗口处于非激活状态时(也就是其他窗口处于激活状态时)触发。
Loaded:显示窗口之前触发。
ContentRendered:当内容显示的时候触发。
Closing:尝试关闭窗口时触发,可以将参数CancelEventArgs的Cancel的属性值设置为true,取消关闭操作。
Closed:在窗口关闭后触发,无法取消。
Unloaded:当窗口关闭后并且从可视化树移除后触发。