Share via


WPF 視窗概觀

使用者是透過視窗與 Windows Presentation Foundation (WPF) 獨立應用程式進行互動的。 視窗的主要目的在於裝載內容,以視覺化表示資料並讓使用者與資料互動。獨立 WPF 應用程式藉由使用 Window 類別而提供自己的視窗。 本主題先介紹 Window,然後才涵蓋在獨立應用程式中建立和管理視窗的基本說明。

注意事項注意事項

由瀏覽器裝載的 WPF 應用程式 (包含 XAML browser applications (XBAPs) 和鬆散Extensible Application Markup Language (XAML) 頁面) 不提供自己的視窗。而是會裝載於 Windows Internet Explorer 所提供的視窗中。請參閱 WPF XAML 瀏覽器應用程式概觀

這個主題包含下列章節。

  • Window 類別
  • 實作視窗
  • 設定 MSBuild 的視窗定義
  • 視窗存留期
  • 視窗位置
  • 視窗大小
  • 調整大小屬性的優先順序
  • 視窗狀態
  • 視窗外觀
  • 安全性考量
  • 其他類型的視窗
  • 相關主題

Window 類別

下圖說明視窗的組成部分。

視窗項目

視窗劃分為兩個區域:工作區和非工作區。

視窗的「非工作區」(Non-Client Area) 是由 WPF 實作的,並包含大部分視窗常見的視窗部分,包括下列項目:

  • 框線。

  • 標題列。

  • 圖示。

  • [最小化]、[最大化] 和 [還原] 按鈕。

  • [關閉] 按鈕。

  • [系統] 功能表,具有可以讓使用者最小化、最大化、還原、移動、調整大小和關閉視窗的功能表項目。

視窗的「工作區」(Client Area) 則是視窗非工作區內的區域,是由開發人員用來加入應用程式專用的內容,例如功能表列、工具列和控制項。

WPF 中的視窗是由 Window 類別封裝的,該類別是用來進行下列作業:

  • 顯示視窗。

  • 設定視窗大小、位置和外觀。

  • 裝載應用程式特定的內容。

  • 管理視窗的存留期。

實作視窗

一般視窗的實作包含外觀和行為兩部分:「外觀」(Appearance) 定義使用者看到視窗的方式,而「行為」(Behavior) 則定義使用者與視窗互動時視窗的運作方式。 在 WPF 中,您可以使用程式碼或 XAML 標記來實作視窗的外觀和行為。

然而,一般而言,視窗的外觀是使用 XAML 標記實作的,而行為則是使用程式碼後置實作的,如下列範例所示。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">

  <!-- Client area (for content) -->

</Window>

Imports System.Windows ' Window

Namespace SDKSample
    Partial Public Class MarkupAndCodeBehindWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub
    End Class
End Namespace
using System.Windows; // Window

namespace SDKSample
{
    public partial class MarkupAndCodeBehindWindow : Window
    {
        public MarkupAndCodeBehindWindow()
        {
            InitializeComponent();
        }
    }
}

若要讓 XAML 標記檔案和程式碼後置的檔案一起運作,需要下列條件:

  • 標記中的 Window 項目必須包含 x:Class 屬性。 建置應用程式時,標記檔案中若存在 x:Class 會造成 Microsoft build engine (MSBuild) 建立衍生自 Window 的 partial 類別,並具有 x:Class 屬性所指定的名稱。 這需要加入 XAML 結構描述的 XML 命名空間宣告 (xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml")。 產生的 partial 類別所實作的 InitializeComponent 方法,是在註冊事件和設定標記所實作的屬性時呼叫的。

  • 程式碼後置中的類別必須是 partial 類別,並具有標記中 x:Class 屬性所指定的相同名稱,且必須衍生自 Window。 允許程式碼後置的檔案與 partial 類別產生關聯,這個類別是在建置應用程式時根據標記產生的 (請參閱建置 WPF 應用程式 (WPF))。

  • 在程式碼後置的情況下,Window 類別必須實作呼叫 InitializeComponent 方法的建構函式。 InitializeComponent 是由標記檔產生的 partial 類別實作,用來註冊事件以及設定標記中定義的屬性。

注意事項注意事項

當您使用 Microsoft Visual Studio 在專案中加入新的 Window 時,Window 是同時使用標記和程式碼後置實作的,且包含必要的組態以建立標記和程式碼後置的檔案間的關聯 (如此處所述)。

隨著這個組態就定位後,您可以專注於在 XAML 標記中定義視窗的外觀,並在程式碼後置中實作視窗的行為。 下列範例所顯示視窗的按鈕是在 XAML 標記中實作的,而按鈕的 Click 事件的事件處理常式則是在程式碼後置中實作的。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">
  <!-- Client area (for content) -->
  <Button Click="button_Click">Click This Button</Button>
</Window>

Imports System.Windows

Namespace SDKSample
    Partial Public Class MarkupAndCodeBehindWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            MessageBox.Show("Button was clicked.")
        End Sub
    End Class
End Namespace
using System.Windows;

namespace SDKSample
{
    public partial class MarkupAndCodeBehindWindow : Window
    {
        public MarkupAndCodeBehindWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Button was clicked.");
        }
    }
}

設定 MSBuild 的視窗定義

您實作視窗的方式會決定視窗針對 MSBuild 的設定方式。 對於同時使用 XAML 標記和程式碼後置定義的視窗:

  • XAML 標記檔案會設定為 MSBuild Page 項目。

  • 程式碼後置的檔案會設定為 MSBuild Compile 項目。

下列 MSBuild 專案檔顯示這項說明。

<Project ... xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    ...
    <Page Include="MarkupAndCodeBehindWindow.xaml" />
    <Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
    ...
</Project>

如需建置 WPF 應用程式的詳細資訊,請參閱建置 WPF 應用程式 (WPF)

視窗存留期

如同任何的類別,視窗的存留期是在第一次具現化開始、接著歷經視窗的開啟、啟動和停用,最終會關閉。

這個章節包含下列子章節。

  • 開啟視窗
  • 視窗啟動
  • 關閉視窗
  • 視窗存留期事件

開啟視窗

若要開啟視窗,您要先建立其執行個體,如下列範例所示範。

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    Startup="app_Startup">
</Application>

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub app_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Create a window
            Dim window As New MarkupAndCodeBehindWindow()

            ' Open a window
            window.Show()
        End Sub
    End Class
End Namespace
using System.Windows;
namespace SDKSample
{
    public partial class App : Application
    {
        void app_Startup(object sender, StartupEventArgs e)
        {
            // Create a window
            MarkupAndCodeBehindWindow window = new MarkupAndCodeBehindWindow();

            // Open a window
            window.Show();
        }
    }
}

本範例中,MarkupAndCodeBehindWindow 是在應用程式啟動時具現化的,也就是在引發 Startup 事件的時間發生。

具現化視窗時,視窗的參考會自動加入到由 Application 物件所管理的視窗清單 (請參閱 Application.Windows)。 除此之外,根據預設,第一個具現化的視窗是由 Application 設定為主應用程式視窗 (請參閱 Application.MainWindow)。

最後會藉由呼叫 Show 方法開啟視窗,結果顯示如下圖。

呼叫 Window.Show 而開啟的視窗

藉由呼叫 Show 所開啟的視窗是非強制回應 (Modeless) 視窗,這代表應用程式運作的模式可以讓使用者在相同應用程式中啟動其他視窗。

注意事項注意事項

ShowDialog 的呼叫是用來以強制回應的方式開啟對話方塊這類的視窗。如需詳細資訊,請參閱對話方塊概觀

呼叫 Show 時,視窗會在顯示前先執行初始化工作,以建立可以讓視窗接收使用者輸入的基礎結構。 初始化視窗時,會引發 SourceInitialized 事件並顯示視窗。

您可以設定 StartupUri 做為捷徑,以指定啟動應用程式時要自動開啟的第一個視窗。

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="PlainWindow.xaml" />

啟動應用程式時,由 StartupUri 值所指定的視窗是以非強制回應方式開啟的,而在內部,視窗是藉由呼叫 Show 方法開啟的。

視窗擁有權

藉由使用 Show 方法開啟的視窗,與建立該視窗的視窗不會有隱含的關聯性,使用者與任一個視窗的互動都與另一個視窗無關,這代表每個視窗都可以進行下列作業:

  • 遮蓋另一個視窗 (除非其中一個視窗的 Topmost 屬性設為 true)。

  • 在不影響另一個視窗的情況下最小化、最大化和還原。

有些視窗與開啟的來源視窗需要具有關聯性。 舉例來說,Integrated Development Environment (IDE) 應用程式可能會開啟的屬性視窗和工具視窗,其一般行為是遮蓋建立這些視窗的視窗。 再者,這類視窗總是會與建立它們的視窗協同作業而關閉、最小化、最大化和還原。 這樣的關聯性,可以藉由讓一個視窗「擁有」(Own) 另一個視窗來建立,且可以藉由設定「附屬視窗」(Owned Window) 的 Owner 屬性搭配「主控視窗」(Owner Window) 的參考來達成。 這會在下列範例中示範。

' Create a window and make this window its owner
Dim ownedWindow As New Window()
ownedWindow.Owner = Me
ownedWindow.Show()
// Create a window and make this window its owner
Window ownedWindow = new Window();
ownedWindow.Owner = this;
ownedWindow.Show();

擁有權建立後:

  • 附屬視窗可以藉由偵測其 Owner 屬性值,來參考主控視窗。

  • 主控視窗可以藉由偵測其 OwnedWindows 屬性值,來探索它擁有的所有視窗。

避免視窗啟動

在某些情況中,視窗在顯示時不應該啟動,例如網際網路 Messenger 類型應用程式的交談視窗,或電子郵件應用程式的通知視窗。

如果您的應用程式有視窗在顯示時不應該啟動,您可以在首次呼叫 Show 方法前,將應用程式的 ShowActivated 屬性設定為 false。 結果如下:

  • 視窗不會啟動。

  • 不會引發視窗的 Activated 事件。

  • 目前已啟動的視窗還是維持已啟動的狀態。

不過只要使用者按一下用戶端或非用戶端區域,這個視窗還是會啟動。 在此情況下:

  • 視窗會啟動。

  • 會引發視窗的 Activated 事件。

  • 先前已啟動的視窗會停用。

  • 接下來會如預期般根據使用者的動作做出回應,引發視窗的 DeactivatedActivated 事件。

視窗啟動

第一次開啟視窗時,視窗會成為使用中視窗 (除非其 ShowActivated 設定為 false 而顯示)。 「使用中視窗」(Active Window) 是目前會捕捉使用者輸入的視窗,例如按鍵和滑鼠點按這類輸入。 當視窗成為使用中時,會引發 Activated 事件。

注意事項注意事項

第一次開啟視窗時,LoadedContentRendered 事件只會在引發 Activated 事件後引發。記住這一點,視窗實際上可以視為是在引發 ContentRendered 時開啟的。

視窗成為使用中後,使用者可以在相同應用程式中啟動其他視窗,或是啟動其他應用程式。 發生這個情況時,目前使用中視窗會成為停用狀態,並引發 Deactivated 事件。 同樣地,當使用者選取目前停用的視窗,視窗會再度成為使用中並引發 Activated

處理 ActivatedDeactivated 的一個原因,在於啟用或停用只能夠在視窗使用中執行的功能。 舉例來說,有些視窗會顯示需要使用者持續輸入和注意的互動式內容,包括遊戲和視訊播放程式。 下列範例中簡化的視訊播放程式,會示範如何處理 ActivatedDeactivated 以實作這個行為。

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.CustomMediaPlayerWindow"
    Activated="window_Activated"
    Deactivated="window_Deactivated">

    <!-- Media Player -->
    <MediaElement 
      Name="mediaElement" 
      Stretch="Fill" 
      LoadedBehavior="Manual" 
      Source="numbers.wmv" />

</Window>

Imports System ' EventArgs
Imports System.Windows ' Window

Namespace SDKSample
    Partial Public Class CustomMediaPlayerWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub window_Activated(ByVal sender As Object, ByVal e As EventArgs)
            ' Recommence playing media if window is activated
            Me.mediaElement.Play()
        End Sub

        Private Sub window_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
            ' Pause playing if media is being played and window is deactivated
            Me.mediaElement.Pause()
        End Sub
    End Class
End Namespace
using System; // EventArgs
using System.Windows; // Window

namespace SDKSample
{
    public partial class CustomMediaPlayerWindow : Window
    {
        public CustomMediaPlayerWindow()
        {
            InitializeComponent();
        }

        void window_Activated(object sender, EventArgs e)
        {
            // Recommence playing media if window is activated
            this.mediaElement.Play();
        }

        void window_Deactivated(object sender, EventArgs e)
        {
            // Pause playing if media is being played and window is deactivated
            this.mediaElement.Pause();
        }
    }
}

當視窗停用時,其他類型的應用程式可能仍會在背景執行程式碼。 舉例來說,當使用者使用其他應用程式時,郵件用戶端可能會繼續輪詢郵件伺服器。 這類的應用程式在主視窗停用時,常會提供不同的或其他的行為。 對於郵件程式而言,這可能代表會將新郵件項目加入到收件匣中,同時在系統匣中加入告知圖示。 只有在郵件視窗不在使用中時,才需要顯示告知圖示,這是藉由偵測 IsActive 屬性而決定的。

當背景工作完成時,視窗可能會想要藉由呼叫 Activate 方法,以更為緊急的方式告知使用者。 在呼叫 Activate 時,如果使用者正在與其他使用中應用程式互動,視窗的工作列按鈕就會閃爍。 如果使用者正在與目前應用程式互動,呼叫 Activate 會將視窗帶到前景中。

注意事項注意事項

您可以使用 Application.ActivatedApplication.Deactivated 事件,處理應用程式範圍的啟動。

關閉視窗

視窗的存留是從啟動開始,持續到使用者關閉它為止。 視窗的關閉可以藉由使用非工作區的項目,包括下列項目:

  • [系統] 功能表的 [關閉] 項目。

  • 按 ALT+F4。

  • 按 [關閉] 按鈕。

您可以提供其他的機制供工作區關閉視窗,較為常用的機制包括下列項目:

  • [檔案] 功能表中的 [結束] 項目,通常用於主應用程式視窗。

  • [檔案] 功能表中的 [關閉] 項目,通常用於次要應用程式視窗。

  • [取消] 按鈕,通常用於強制回應對話方塊。

  • [關閉] 按鈕,通常用於非強制回應對話方塊。

若要關閉視窗以回應其中一個自訂機制,需要呼叫 Close 方法。 下列範例實作的能力,可以藉由選擇 [檔案] 功能表中的 [結束] 關閉視窗。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.WindowWithFileExit">

  <Menu>
    <MenuItem Header="_File">
      <MenuItem Header="E_xit" Click="fileExitMenuItem_Click" />
    </MenuItem>
  </Menu>

</Window>

Imports System.Windows ' window, RoutedEventArgs

Namespace SDKSample
    Partial Public Class WindowWithFileExit
        Inherits System.Windows.Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub fileExitMenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Close this window
            Me.Close()
        End Sub
    End Class
End Namespace
using System.Windows; // window, RoutedEventArgs

namespace SDKSample
{
    public partial class WindowWithFileExit : System.Windows.Window
    {
        public WindowWithFileExit()
        {
            InitializeComponent();
        }

        void fileExitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Close this window
            this.Close();
        }
    }
}

視窗關閉時會引發兩個事件:ClosingClosed

Closing 是在視窗關閉前引發的,所提供的機制可以防止視窗關閉。 防止視窗關閉的一個原因,是針對視窗內容包含修改過的資料時。 在這種情況下,Closing 事件的處理可以判斷資料是否經過變更,如果是的話,將詢問使用者是否要繼續關閉視窗而不儲存資料,或者是取消視窗關閉。 下列範例顯示處理 Closing 的主要方向。


Imports System ' EventArgs
Imports System.ComponentModel ' CancelEventArgs
Imports System.Windows ' window

Namespace VisualBasic
    Partial Public Class DataWindow
        Inherits Window
        ' Is data dirty
        Private isDataDirty As Boolean = False


...


        Private Sub DataWindow_Closing(ByVal sender As Object, ByVal e As CancelEventArgs)
            MessageBox.Show("Closing called")

            ' If data is dirty, notify user and ask for a response
            If Me.isDataDirty Then
                Dim msg As String = "Data is dirty. Close without saving?"
                Dim result As MessageBoxResult = MessageBox.Show(msg, "Data App", MessageBoxButton.YesNo, MessageBoxImage.Warning)
                If result = MessageBoxResult.No Then
                    ' If user doesn't want to close, cancel closure
                    e.Cancel = True
                End If
            End If
        End Sub
    End Class
End Namespace
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // window

namespace CSharp
{
    public partial class DataWindow : Window
    {
        // Is data dirty
        bool isDataDirty = false;


...


        void DataWindow_Closing(object sender, CancelEventArgs e)
        {
            MessageBox.Show("Closing called");

            // If data is dirty, notify user and ask for a response
            if (this.isDataDirty)
            {
                string msg = "Data is dirty. Close without saving?";
                MessageBoxResult result = 
                  MessageBox.Show(
                    msg, 
                    "Data App", 
                    MessageBoxButton.YesNo, 
                    MessageBoxImage.Warning);
                if (result == MessageBoxResult.No)
                {
                    // If user doesn't want to close, cancel closure
                    e.Cancel = true;
                }
            }
        }
    }
}

Closing 事件處理常式傳遞的 CancelEventArgs,會實作您設定為 true 的 Boolean Cancel 屬性,以防止視窗關閉。

如果沒有處理 Closing,或是處理作業遭到取消,就會關閉視窗。 就在視窗要確實關閉前一刻,會引發 Closed。 此時就無法防止視窗關閉。

注意事項注意事項

您可以設定應用程式在主應用程式視窗關閉時 (請參閱 MainWindow) 或者是最後一個視窗關閉時自動關閉。如需詳細資訊,請參閱ShutdownMode

雖然視窗可以透過非工作區和工作區所提供的機制明確關閉,但視窗也可以因為應用程式其他部分或 Windows 的行為而隱含關閉,包括下列行為:

注意事項注意事項

視窗關閉後無法重新開啟。

視窗存留期事件

下圖顯示視窗存留期中的主體事件序列。

視窗存留期

下圖顯示在顯示時未啟動的視窗在存留期中的主體事件序列 (ShowActivated 在視窗顯示前設定為 false)。

視窗存留期 (Window.ShowActivated = False)

視窗位置

視窗開啟時,會有相對於桌面的 x 和 y 維度位置。 這個位置的判斷可以藉由偵測相對的 LeftTop 屬性。 您可以設定這些屬性以變更視窗的位置。

您也可以指定 Window 第一次出現時的初始位置,方法是以下列其中一個 WindowStartupLocation 列舉值設定 WindowStartupLocation 屬性:

如果啟動位置是指定為 Manual,而且沒有設定 LeftTop 屬性,Window 將會詢問 Windows 要在什麼位置出現視窗。

最上層顯示視窗和疊置順序

除了具有 x 和 y 位置之外,視窗在 z 維度也是有位置的,這是用來決定相對於其他視窗的垂直位置。 這就是所謂的疊置順序,包含兩種類型:一般疊置順序和最上層疊置順序。 「一般疊置順序」(Normal Z-order) 中的視窗位置,是由視窗目前是否為使用中決定。 根據預設,視窗會位於一般疊置順序中。 「最上層疊置順序」(Topmost Z-order) 中的視窗位置,也是由視窗目前是否為使用中決定。 此外,最上層疊置順序的視窗永遠會位在一般疊置順序的視窗上方。 藉由將視窗的 Topmost 屬性設定為 true,視窗就會位於最上層疊置順序。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Topmost="True">


...


</Window>

在每個疊置順序內,目前使用中視窗會出現在相同疊置順序中的所有其他視窗上方。

視窗大小

除了具有桌面位置外,視窗的大小是由數種屬性決定的,包括各種的寬度和高度屬性,以及 SizeToContent

MinWidthWidthMaxWidth 是用於管理視窗在存留期中可以有的寬度範圍,設定方式如下列範例所示。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinWidth="300" Width="400" MaxWidth="500">


...


</Window>

視窗高度是由 MinHeightHeightMaxHeight 所管理的,設定方式如下列範例所示。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinHeight="300" Height="400" MaxHeight="500">


...


</Window>

因為各種寬度值和高度值每種都會指定範圍,所以可調整大小視窗的寬度和高度,有可能在各自維度所指定範圍內的任何地方。 若要偵測目前寬度和高度,請分別偵測 ActualWidthActualHeight

如果您希望視窗的寬度和高度,能夠依據視窗內容調整大小,您可以使用具有下列值的 SizeToContent 屬性:

下列程式碼顯示的視窗會在第一次顯示時,同時在垂直和水平方向上,自動調整成其內容的大小。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    SizeToContent="WidthAndHeight">


...


</Window>

調整大小屬性的優先順序

基本上,視窗的各種大小屬性結合,可以定義可調整大小視窗的寬度和高度範圍。 為了確保維持有效的範圍,Window 會使用下列優先順序評估大小屬性的值。

針對高度屬性:

  1. FrameworkElement.MinHeight >

  2. FrameworkElement.MaxHeight >

  3. SizeToContent.Height/SizeToContent.WidthAndHeight >

  4. FrameworkElement.Height

針對寬度屬性:

  1. FrameworkElement.MinWidth >

  2. FrameworkElement.MaxWidth >

  3. SizeToContent.Width/SizeToContent.WidthAndHeight >

  4. FrameworkElement.Width

優先順序也可以決定視窗最大化時的大小,這是使用 WindowState 屬性決定的。

視窗狀態

可調整大小視窗在存留期中可以有三種狀態:標準、最小化和最大化。 具有「標準」(Normal) 狀態的視窗是視窗的預設狀態。 這種狀態的視窗如果是可調整大小的話,則可以讓使用者藉由使用調整大小底框或框線來移動或調整大小。

具有「最小化」(Minimized) 狀態的視窗,如果其 ShowInTaskbar 設定為 true 時,會將視窗摺疊至工作列按鈕,否則會盡可能摺疊到最小並將視窗本身的位置重新調整到桌面左下角。 這兩種類型的最小化視窗都不能使用框線或調整大小底框來調整大小,雖然沒有顯示在工作列的最小化視窗是可以在桌面上拖曳的。

具有「最大化」(Maximized) 狀態的視窗,會盡可能擴展到最大化大小,最大只能到其 MaxWidthMaxHeightSizeToContent 屬性所支配的大小。 如同最小化視窗一樣,最大化視窗不能使用調整大小底框或拖曳框線來調整大小。

注意事項注意事項

視窗的 TopLeftWidthHeight 屬性值永遠表示正常狀態下的值,即使視窗目前已最大化或最小化也一樣。

視窗狀態的設定可以藉由設定其 WindowState 屬性來達成,該屬性可以有下列其中一個 WindowState 列舉值:

下列範例顯示如何建立在開啟視窗時顯示為最大化的視窗。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowState="Maximized">


...


</Window>

一般而言,您應該設定 WindowState 以設定視窗的初始狀態。 在可調整大小視窗顯示後,使用者就可以按視窗標題列的最小化、最大化和還原按鈕,變更視窗狀態。

視窗外觀

藉由加入視窗特定的內容,例如按鈕、標籤和文字方塊,您可以變更視窗工作區的外觀。 為了設定非工作區,Window 提供數種屬性,包括用於設定視窗圖示的 Icon 以及用於設定標題的 Title

您也可以變更非工作區框線的外觀和行為,方法是藉由設定視窗的調整大小模式、視窗樣式,以及是否要在桌面工作列顯示為按鈕。

這個章節包含下列子章節。

  • 調整大小模式
  • 視窗樣式
  • 工作列的存在

調整大小模式

依據 WindowStyle 屬性,您可以控制使用者調整視窗大小的方式 (以及使用者是否能調整視窗大小)。 視窗樣式的選擇會影響到下列項目:使用者是否可以藉由滑鼠拖曳框線來調整大小、非工作區是否要顯示 [最小化]、[最大化] 和 [調整大小] 按鈕,以及在顯示這些按鈕的情況下是否要啟用這些按鈕。

視窗調整大小的方式可以藉由設定其 ResizeMode 屬性來設定,該屬性可以是下列其中一個 ResizeMode 列舉值:

WindowStyle 一樣,視窗的調整大小模式在存留期間不太會變更,這代表您最可能會在 XAML 標記設定這個屬性。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ResizeMode="CanResizeWithGrip">


...


</Window>

請注意,藉由偵測 WindowState 屬性,您可以偵測視窗是否最大化、最小化或還原。

視窗樣式

視窗非工作區所公開的框線適用於大部分應用程式。 然而,有些情況下,依據視窗的類型,會需要不同類型的框線,或是根本不需要框線。

若要控制視窗要取得什麼類型的框線,您可以設定 WindowStyle 屬性,搭配下列其中一個 WindowStyle 列舉值:

下圖說明這些視窗樣式的效果。

視窗樣式

您可以使用 XAML 標記或程式碼設定 WindowStyle,因為這個屬性在視窗存留期間不太會變更,而您最可能會使用 XAML 標記進行設定。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowStyle="ToolWindow">


...


</Window>

非矩形視窗樣式

有的時候,WindowStyle 所允許您使用的框線樣式並不足夠。 舉例來說,您可能會想建立非矩形框線的應用程式,就像 Microsoft Windows Media Player 所使用的。

例如,您可以考慮下圖顯示的文字泡泡視窗。

非矩形視窗

這類型視窗的建立方式可以藉由將 WindowStyle 屬性設定為 None,並使用 Window 針對透明度的特殊支援。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowStyle="None"
    AllowsTransparency="True"
    Background="Transparent">


...


</Window>

這項值的組合所建構的視窗會呈現完全透明狀。 在這種情況下,視窗的非工作區裝飾項目 ([關閉] 功能表、[最小化]、[最大化] 和 [還原] 按鈕等等) 就無法使用。 因此,就需要提供您自己的裝飾項目。

工作列的存在

視窗的預設外觀包含工作列按鈕,就像下圖所顯示的。

具有工作列按鈕的視窗

有些類型的視窗沒有工作列按鈕,例如訊息方塊和對話方塊 (請參閱對話方塊概觀)。 您可以控制是否要顯示視窗的工作列按鈕,方法是藉由設定 ShowInTaskbar 屬性 (預設為 true)。

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ShowInTaskbar="False">


...


</Window>

安全性考量

Window 需要 UnmanagedCode 安全性權限才能具現化。 對於在本機電腦上安裝和啟動的應用程式,這屬於授予應用程式的權限集合內。

然而,對於使用 ClickOnce 從網際網路或近端內部網路區域啟動的應用程式而言,這並不在授與該應用程式的權限集合範圍內。 因此,使用者會收到 ClickOnce 安全性警告,並需要將應用程式的權限集合提高為完全信任。

此外,根據預設,XBAPs 無法顯示視窗或對話方塊。 如需獨立應用程式安全性考量的討論,請參閱 WPF 安全性策略 – 平台安全性

其他類型的視窗

NavigationWindow 是設計用來裝載可巡覽內容的視窗。 如需詳細資訊,請參閱巡覽概觀

對話方塊則是通常用來向使用者收集資訊以完成運作的視窗。 舉例來說,當使用者要開啟檔案時,應用程式通常會顯示 [開啟檔案] 對話方塊,以向使用者取得檔名。 如需詳細資訊,請參閱對話方塊概觀

請參閱

參考

Window

MessageBox

NavigationWindow

Application

概念

對話方塊概觀

建置 WPF 應用程式 (WPF)