1. 程式人生 > >WPF程式設計學習——視窗

WPF程式設計學習——視窗

  1.視窗的外觀

  2.視窗的位置

  3.視窗的大小

  4.視窗的可見性和狀態

  5.視窗的生命週期

1.視窗的外觀

  WPF中預設視窗框架的外觀,主要取決於Icon、TitleWindowsStyleResizeMode等屬性。

  Icon 指定視窗的圖示;

  Title 指定視窗的標題;

  WindowStyle 指定視窗樣式,有4個取值:

    None,無邊框;(當ResizeMode屬性為NoResize時,僅剩下視窗核心。)

    SingleBorderWindow,單邊框【預設】;

    ThreeDBorderWindow,3D邊框;

    ToolBorderWindow,工具箱視窗;

  ResizeMode 是指定大小調節樣式,有4個取值:

    NoResize,不可調節,同時沒有最大最小按鈕;

    CanMinimize,不可調節。但可以最小化;(此時最大化按鈕不可用)

    CanResize,可調節【預設】;

    CanResizeWithGrid,可根據網格調節;(視窗右下腳顯示可調節網格)

2.視窗的位置

  WindowStartLocation 指定視窗初始位置,有3個取值:

    Manual,手工指定位置,表示可以通過設定其TopLeft屬性值來決定視窗的初始位置;

    CenterScreen,螢幕中央;

    CenterOwner,父窗體中央;

  TopMost 調節視窗的前後順序,屬性值為true時,視窗位於最前。

    TopMost值為true的視窗,位於TopMost值為false的視窗之前(如下圖記事本與示例視窗);

    TopMost值都為true的視窗,獲得焦點的視窗位於前(如下圖QQ與示例視窗)。

  

3.視窗的大小

  WidthHeight,分別表示視窗的寬度和高度,稱為“尺寸屬性”。

  MaxWidth、MinWidth、MaxHeight、MinHeight,分別表示視窗最大寬度、最小寬度、最大高度、最小高度。可以通過得到和更改這些屬性值,來獲取和改變視窗的大小和長寬範圍。

  ActualWidth

ActualHeight,分別表示視窗的實際寬度和實際高度,稱為“實際尺寸屬性”。

實際尺寸屬性是根據當前視窗大小、最小化時視窗大小和最大化時視窗大小來計算得到的,其值是隻讀的,也就是說,不能通過改變ActualWidth、ActualHeight的值來更改視窗大小。

  SizeToContent,表示視窗大小由內容決定,有4個取值:

    Manual,手工【預設】;

    Width,窗體寬度由內容決定;

    Height,窗體高度由內容決定;

    WidthAndHeight,窗體大小由內容決定;

  如果內容尺寸超過了視窗的最大或最小範圍,還是以最大/最小範圍為主。如果手工指定了視窗的Width、Height 屬性,那麼SizeToContent將被忽略。

  ReSize,視窗大小的可調整性(第1部分已提到)。

4.視窗的可見性和狀態

  Visibility,視窗可見性,有4個列舉值:

    Visiable,可見;

    Hidden,隱藏;

    Collapsed,摺疊。

  雖然視窗類認為Collapsed與Hidden一樣,但二者區別在於,Hidden僅僅將元素設為不可見,但是元素在畫面上依然佔有空間;而Collapsed,在不可視的基礎上,能將元素在畫面上的佔位符清除,元素徹底不影響畫面。

  ShowHide,顯示視窗和隱藏視窗的兩個方法。如果視窗的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:當關閉視窗並且從視覺化樹移除後觸發。