WPF程式設計學習——視窗
1.視窗的外觀
2.視窗的位置
3.視窗的大小
4.視窗的可見性和狀態
5.視窗的生命週期
1.視窗的外觀
WPF中預設視窗框架的外觀,主要取決於Icon、Title、WindowsStyle、ResizeMode等屬性。
Icon 指定視窗的圖示;
Title 指定視窗的標題;
WindowStyle 指定視窗樣式,有4個取值:
None,無邊框;(當ResizeMode屬性為NoResize時,僅剩下視窗核心。)
SingleBorderWindow,單邊框【預設】;
ThreeDBorderWindow,3D邊框;
ToolBorderWindow,工具箱視窗;
ResizeMode 是指定大小調節樣式,有4個取值:
NoResize,不可調節,同時沒有最大最小按鈕;
CanMinimize,不可調節。但可以最小化;(此時最大化按鈕不可用)
CanResize,可調節【預設】;
CanResizeWithGrid,可根據網格調節;(視窗右下腳顯示可調節網格)
2.視窗的位置
WindowStartLocation 指定視窗初始位置,有3個取值:
Manual,手工指定位置,表示可以通過設定其Top、Left屬性值來決定視窗的初始位置;
CenterScreen,螢幕中央;
CenterOwner,父窗體中央;
TopMost 調節視窗的前後順序,屬性值為true時,視窗位於最前。
TopMost值為true的視窗,位於TopMost值為false的視窗之前(如下圖記事本與示例視窗);
TopMost值都為true的視窗,獲得焦點的視窗位於前(如下圖QQ與示例視窗)。
3.視窗的大小
Width、Height,分別表示視窗的寬度和高度,稱為“尺寸屬性”。
MaxWidth、MinWidth、MaxHeight、MinHeight,分別表示視窗最大寬度、最小寬度、最大高度、最小高度。可以通過得到和更改這些屬性值,來獲取和改變視窗的大小和長寬範圍。
ActualWidth
實際尺寸屬性是根據當前視窗大小、最小化時視窗大小和最大化時視窗大小來計算得到的,其值是隻讀的,也就是說,不能通過改變ActualWidth、ActualHeight的值來更改視窗大小。
SizeToContent,表示視窗大小由內容決定,有4個取值:
Manual,手工【預設】;
Width,窗體寬度由內容決定;
Height,窗體高度由內容決定;
WidthAndHeight,窗體大小由內容決定;
如果內容尺寸超過了視窗的最大或最小範圍,還是以最大/最小範圍為主。如果手工指定了視窗的Width、Height 屬性,那麼SizeToContent將被忽略。
ReSize,視窗大小的可調整性(第1部分已提到)。
4.視窗的可見性和狀態
Visibility,視窗可見性,有4個列舉值:
Visiable,可見;
Hidden,隱藏;
Collapsed,摺疊。
雖然視窗類認為Collapsed與Hidden一樣,但二者區別在於,Hidden僅僅將元素設為不可見,但是元素在畫面上依然佔有空間;而Collapsed,在不可視的基礎上,能將元素在畫面上的佔位符清除,元素徹底不影響畫面。
Show、Hide,顯示視窗和隱藏視窗的兩個方法。如果視窗的ShowInTaskbar屬性值為true,Hide不但隱藏視窗本身,同時隱藏其在工作列上的圖示。
WindowState,視窗狀態屬性,有3個列舉值:
Normal,正常;
Maximized,最大化;
Minimized,最小化;
RestoreBounds,獲取視窗在最小化或最大化之前的大小和位置,有4個列舉值,Top、Left、Width、Height。
//輸出當前視窗的RestoreBounds值private void button1_Click(object sender, RoutedEventArgs e) { MessageBox.Show(this.RestoreBounds.ToString()); }
該主視窗的Top:75,Left:75,Width:525,Height:350
只有視窗在Normal狀態下移動或調整時,RestoreBounds的值才會改變。於是可以在視窗關閉時將RestoreBounds屬性值儲存到配置檔案,下一次啟動程式視窗時,讀取上次儲存的視窗大小、位置,來初始化視窗,以此實現儲存使用者配置等功能。MSDN上的例子:http://msdn.microsoft.com/zh-cn/library/system.windows.window.restorebounds.aspx 。但推薦使用config檔案來儲存配置,更方便。
應用程式視窗在上次關閉處啟動
向資源中新增兩個變數MainRestoreBounds和MainWindowState,對應型別如圖所示,用於儲存主視窗的RestoreBounds屬性值。
XAML
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="360" Height="240" Closing="Window_Closing"> </Window>
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //讀取配置檔案 try { //設定位置、大小 Rect restoreBounds = Properties.Settings.Default.MainRestoreBounds; this.WindowState = WindowState.Normal; this.Left = restoreBounds.Left; this.Top = restoreBounds.Top; this.Width = restoreBounds.Width; this.Height = restoreBounds.Height; //設定視窗狀態 this.WindowState = Properties.Settings.Default.MainWindowState; } catch { } } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { //儲存當前位置、大小和狀態,到配置檔案 Properties.Settings.Default.MainRestoreBounds = this.RestoreBounds; Properties.Settings.Default.MainWindowState = this.WindowState; Properties.Settings.Default.Save(); } } }
5.視窗的生命週期
關於各事件的描述:
Initialized:當視窗的FrameworkElement底層初始化時觸發,即InitializeComponent方法呼叫時觸發。
LocationChanged:視窗被移動時觸發。
Activated:視窗被啟用時觸發。
Deactivated:視窗處於非啟用時(即其他視窗處於啟用時)觸發。
Loaded:顯示視窗之前觸發。
ContentRendered:當內容顯示的時候觸發。
Closing:嘗試關閉視窗時觸發,可以將引數CancelEventArgs的Cancel的屬性設定為true,取消關閉操作。
Closed:在視窗關閉後觸發該事件,無法取消。
Unloaded:當關閉視窗並且從視覺化樹移除後觸發。