WPF Windows'a Genel Bakış

Kullanıcılar windows aracılığıyla Windows Presentation Foundation (WPF) tek başına uygulamalarıyla etkileşim kurar. Pencerenin birincil amacı, verileri görselleştiren ve kullanıcıların verilerle etkileşim kurmasını sağlayan içeriği barındırmaktır. Tek başına WPF uygulamaları sınıfını Window kullanarak kendi pencerelerini sağlar. Bu konu başlığında, tek başına uygulamalarda pencere oluşturma ve yönetme ile ilgili temel bilgiler yer almadan önce açıklanır Window .

Dekont

XAML tarayıcı uygulamaları (XBAPs) ve gevşek Genişletilebilir Uygulama Biçimlendirme Dili (XAML) sayfaları dahil olmak üzere tarayıcıda barındırılan WPF uygulamaları kendi pencerelerini sağlamaz. Bunun yerine, Windows Internet Explorer tarafından sağlanan pencerelerde barındırılırlar. Bkz. WPF XAML Tarayıcı Uygulamalarına Genel Bakış.

Pencere Sınıfı

Aşağıdaki şekilde bir pencerenin kurucu bölümleri gösterilmektedir:

Screenshot that shows window elements.

Pencere iki alana ayrılır: istemci olmayan alan ve istemci alanı.

Bir pencerenin istemci olmayan alanı WPF tarafından uygulanır ve aşağıdakiler de dahil olmak üzere pencerenin, çoğu pencere için ortak olan bölümlerini içerir:

  • Kenarlık.

  • Başlık çubuğu.

  • Bir simge.

  • Simge Durumuna Küçült, Ekranı Kapla ve Geri Yükle düğmeleri.

  • Kapat düğmesi.

  • Kullanıcıların bir pencereyi simge durumuna küçültmesine, ekranı kaplamasına, geri yüklemesine, taşımasına, yeniden boyutlandırmasına ve kapatmasına olanak sağlayan menü öğelerini içeren bir Sistem menüsü.

Pencerenin istemci alanı, pencerenin istemci olmayan alanı içindeki alandır ve geliştiriciler tarafından menü çubukları, araç çubukları ve denetimler gibi uygulamaya özgü içeriği eklemek için kullanılır.

WPF'de bir pencere, aşağıdakileri yapmak için kullandığınız Window sınıfı tarafından kapsüllenmiş durumdadır:

  • Pencere görüntüleme.

  • Pencerenin boyutunu, konumunu ve görünümünü yapılandırma.

  • Uygulamaya özgü içeriği barındırma.

  • Pencerenin ömrünü yönetme.

Pencere Uygulama

Tipik bir pencerenin uygulanması hem görünümden hem de davranışlardan oluşur. Burada görünüm , bir pencerenin kullanıcılara nasıl göründüğünü ve davranış , kullanıcılarla etkileşim kurarken pencerenin nasıl çalıştığını tanımlar. WPF'de, kod veya XAML işaretlemesi kullanarak bir pencerenin görünümünü ve davranışını uygulayabilirsiniz.

Ancak genel olarak, bir pencerenin görünümü XAML işaretlemesi kullanılarak uygulanır ve davranışı aşağıdaki örnekte gösterildiği gibi arka planda kod kullanılarak uygulanır.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">
  
  <!-- Client area (for content) -->
  
</Window>
using System.Windows;

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

Imports System.Windows

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

Bir XAML işaretleme dosyasının ve arka plan kod dosyasının birlikte çalışmasını sağlamak için aşağıdakiler gereklidir:

  • İşaretlemede Window öğesinin x:Class özniteliğini içermesi gerekir. Uygulama oluşturulduğunda, işaretleme dosyasındaki varlığıx:Class, Microsoft derleme altyapısının (MSBuild) özniteliği tarafından belirtilen ada sahip ve öğesinden Window türetilen bir partial sınıf oluşturmasına x:Class neden olur. Bunun için XAML şeması ( xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ) için bir XML ad alanı bildirimi eklenmesi gerekir. Oluşturulan partial sınıfı, olayları kaydetmek ve işaretlemede uygulanan özellikleri ayarlamak için çağrılan InitializeComponent yöntemini uygular.

  • Arka plan kodda sınıf, işaretlemede x:Class özniteliği tarafından belirtilen aynı ada sahip bir partial sınıfı olmalıdır ve Window öğesinden türetilmelidir. Bu, arka planda kod dosyasının uygulama oluşturulduğunda işaretleme dosyası için oluşturulan sınıfla partial ilişkilendirilmesine olanak tanır (bkz . WPF Uygulaması Oluşturma).

  • Arka plan kodda Window sınıfı, InitializeComponent yöntemini çağıran bir oluşturucu uygulamalıdır. InitializeComponent, olayları kaydetmek ve işaretlemede tanımlanan özellikleri ayarlamak için, işaretleme dosyasının oluşturulan partial sınıfı tarafından uygulanır.

Dekont

Visual Studio kullanarak projenize yeni bir Window eklediğinizde, Window hem işaretleme hem de arka planda kod kullanılarak uygulanır ve burada açıklandığı gibi işaretleme ve arka planda kod dosyaları arasında ilişki oluşturmak için gerekli yapılandırmayı içerir.

Bu yapılandırma uygulandığında, pencerenin XAML işaretlemesindeki görünümünü tanımlamaya ve davranışını arka plan kodda uygulamaya odaklanabilirsiniz. Aşağıdaki örnekte, XAML işaretlemesinde uygulanan bir düğme ve arka planda uygulanan düğme Click olayı için bir olay işleyicisi içeren bir pencere gösterilmektedir.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">
  <!-- Client area (for content) -->
  <Button Click="button_Click">Click This Button</Button>
</Window>
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.");
        }
    }
}

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

MSBuild için Pencere Tanımı Yapılandırma

Pencerenizi nasıl uygulayabileceğiniz, MSBuild için nasıl yapılandırıldığını belirler. Hem XAML işaretlemesi hem de arka plan kod kullanılarak tanımlanan bir pencere için:

  • XAML işaretleme dosyaları, MSBuild Page öğeleri olarak yapılandırılır.

  • Arka plan kod dosyaları, MSBuild Compile öğeleri olarak yapılandırılır.

Bu, aşağıdaki MSBuild proje dosyasında gösterilir.

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

WPF uygulamaları oluşturma hakkında bilgi için bkz . WPF Uygulaması Oluşturma.

Pencere Ömrü

Herhangi bir sınıfta olduğu gibi, bir pencerenin de ilk örneği oluşturulduğunda başlayan, daha sonra açıldığı, etkinleştirildiği ve devre dışı bırakıldığı ve sonunda kapatıldığı bir yaşam süresi vardır.

Pencere Açma

Bir pencereyi açmak için önce aşağıdaki örnekte gösterilen bir örneğini oluşturursunuz.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    Startup="app_Startup">
</Application>
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();
        }
    }
}

Bu örnekte, MarkupAndCodeBehindWindow uygulama başlatıldığında örneği oluşturulur ve olay tetiklendiğinde Startup gerçekleşir.

Bir pencere örneği oluşturulduğunda, nesne tarafından Application yönetilen pencereler listesine otomatik olarak bir başvuru eklenir (bkz Application.Windows. ). Ayrıca, örneği oluşturulacak ilk pencere varsayılan olarak ana uygulama penceresi olarak ayarlanır Application (bkz Application.MainWindow. ).

Pencere son olarak yöntemi çağrılarak Show açılır; sonuç aşağıdaki şekilde gösterilir.

A Window Opened by calling Window.Show

Çağrılarak Show açılan pencere, modsuz bir penceredir ve bu da uygulamanın kullanıcıların aynı uygulamadaki diğer pencereleri etkinleştirmesine olanak tanıyan bir modda çalıştığı anlamına gelir.

Dekont

ShowDialog , iletişim kutuları gibi pencereleri modlu olarak açmak için çağrılır. Daha fazla bilgi için bkz . İletişim Kutularına Genel Bakış .

Çağrıldığında Show , bir pencere kullanıcı girişi almasına izin veren bir altyapı oluşturmak için gösterilmeden önce başlatma çalışması gerçekleştirir. Pencere başlatıldığında SourceInitialized olayı oluşturulur ve pencere gösterilir.

Kısayol olarak, StartupUri bir uygulama başlatıldığında otomatik olarak açılan ilk pencereyi belirtmek için ayarlanabilir.

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

Uygulama başlatıldığında, değeri StartupUri tarafından belirtilen pencere moduz bir şekilde açılır; dahili olarak, yöntemi çağrılarak Show açılır.

Pencere Sahipliği

yöntemi kullanılarak Show açılan bir pencerenin, onu oluşturan pencereyle örtük bir ilişkisi yoktur; kullanıcılar iki pencereyle de diğer pencerelerden bağımsız olarak etkileşim kurabilir; başka bir deyişle her iki pencere de aşağıdakileri yapabilir:

  • Diğerini kapatma (pencerelerden birinin Topmost özelliği true olarak ayarlanmadığı sürece).

  • Diğerini etkilemeden küçültülme, ekranı kaplama ve geri yüklenme.

Bazı pencereler, bunları açan pencereyle bir ilişki gerektirir. Örneğin, bir Tümleşik Geliştirme Ortamı (IDE) uygulaması, tipik davranışı bunları oluşturan pencereyi kapatmak olan özellik pencerelerini ve araç pencerelerini açabilir. Ayrıca, bu tür pencereler her zaman onları oluşturan pencereyle uyumlu olarak kapanmalı, simge durumuna küçültmeli, ekranı kaplamalı ve geri yüklemelidir. Böyle bir ilişki, bir pencerenin başka bir pencereye sahip olmasıyla oluşturulabilir ve sahip olunan pencereninOwner özelliği sahip penceresine bir başvuruyla ayarlanarak elde edilir. Bu, aşağıdaki örnekte gösterilir.

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

Sahiplik oluşturulduktan sonra:

  • Sahip olunan pencere, Owner özelliğinin değerini inceleyerek sahip penceresine başvurabilir.

  • Sahip penceresi, OwnedWindows özelliğinin değerini inceleyerek sahip olduğu tüm pencereleri bulabilir.

Pencere Etkinleştirmeyi Engelleme

İnternet messenger stilinde bir uygulamanın konuşma pencereleri veya bir e-posta uygulamasının bildirim pencereleri gibi, gösterildiğinde pencerelerin etkinleştirilmemesi gereken senaryolar vardır.

Uygulamanızın gösterildiğinde etkinleştirilmemesi gereken bir penceresi varsa, Show yöntemini ilk kez çağırmadan önce ShowActivated özelliğini false olarak ayarlayabilirsiniz. Sonuç olarak:

  • Pencere etkinleştirilmedi.

  • Pencerenin Activated olayı tetiklenmez.

  • Mevcut durumda etkinleştirilmiş olan pencere etkin kalır.

Ancak, kullanıcı istemci veya istemci olmayan alana tıklayarak etkinleştirdiği anda pencere etkinleştirilir. Bu durumda:

  • Pencere etkinleştirilir.

  • Pencerenin Activated olayı tetiklenir.

  • Önceden etkinleştirilen pencere devre dışı bırakılır.

  • Deactivated Pencerenin ve Activated olayları daha sonra kullanıcı eylemlerine yanıt olarak beklendiği gibi oluşturulur.

Pencere Etkinleştirme

Bir pencere ilk kez açıldığında etkin pencere olur (olarak ayarlı falseolarak gösterilmediği ShowActivated sürece). Etkin pencere, o anki tuş vuruşları ve fare tıklamaları gibi kullanıcı girişini yakalayan penceredir. Bir pencere etkin hale geldiğinde Activated olayını tetikler.

Dekont

Bir pencere ilk açıldığında, Loaded ve ContentRendered olayları yalnızca Activated olayı tetiklendiğinde tetiklenir. Bunu göz önünde bulundurarak, bir pencere,ContentRendered tetiklendiğinde etkin bir şekilde açılmış olarak kabul edilebilir.

Bir pencere etkinleştirildikten sonra, kullanıcı aynı uygulamadaki başka bir pencereyi veya başka bir uygulamayı etkinleştirebilir. Bu durumda etkin olan pencere devre dışı bırakılır ve Deactivated olayı tetiklenir. Benzer şekilde, kullanıcı şu anda devre dışı bırakılmış bir pencereyi seçtiğinde, pencere yeniden etkinleşir ve Activated tetiklenir.

Activated ve Deactivated işlenmesinin yaygın nedenlerinden biri, yalnızca bir pencere etkin olduğunda çalışabilen işlevselliği etkinleştirmek ve devre dışı bırakmaktır. Örneğin bazı pencereler, oyunlar ve video oynatıcılar da dahil olmak üzere sürekli kullanıcı girişi veya dikkat gerektiren etkileşimli içerik görüntüler. Aşağıdaki örnek, bu davranışı uygulamak için Activated ve Deactivated öğelerinin nasıl işleneceğini gösteren basitleştirilmiş bir video oynatıcıdır.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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>
using System;
using System.Windows;

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();
        }
    }
}

Imports System.Windows

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

Pencere devre dışı bırakıldığında diğer uygulama türleri arka planda kod çalıştırmaya devam edebilir. Örneğin, bir posta istemcisi, kullanıcı diğer uygulamaları kullanırken posta sunucusunu yoklama işlemine devam edebilir. Bunlar gibi uygulamalar genellikle ana pencere devre dışı bırakılırken farklı veya ek davranışlar sağlar. Posta programıyla ilgili olarak, bu hem yeni posta öğesini gelen kutusuna ekleme hem de sistem tepsisine bir bildirim simgesi ekleme anlamına gelebilir. Bildirim simgesinin görüntülenmesi için posta penceresinin etkin olmadığı durumlarda görüntülenmesi gerekir. Bu, özelliği incelenerek IsActive belirlenebilir.

Bir arka plan görevi tamamlanırsa, bir pencere Activate yöntemi çağırarak kullanıcıyı daha acil bir şekilde bilgilendirmek isteyebilir. Activate çağrıldığında kullanıcı, etkinleştirilen başka bir uygulamayla etkileşimdeyse pencerenin görev çubuğu düğmesi yanıp söner. Kullanıcı geçerli uygulamayla etkileşimde bulunuyorsa, çağrı Activate yapmak pencereyi ön plana getirir.

Dekont

Application.Activated ve Application.Deactivated olaylarını kullanarak uygulama kapsamı etkinleştirmesini işleyebilirsiniz.

Pencereyi Kapatma

Bir kullanıcı pencereyi kapattığında pencerenin ömrü sona ermeye başlar. Aşağıdakiler de dahil olmak üzere istemci olmayan alandaki öğeler kullanılarak bir pencere kapatılabilir:

  • Sistem menüsünün Kapat öğesi.

  • ALT+F4 tuşlarına basın.

  • Kapat düğmesine basarak.

Bir pencereyi kapatmak için istemci alanına ek mekanizmalar sağlayabilirsiniz; bu mekanizmalardan daha yaygın olanı şunlardır:

  • Genellikle ana uygulama pencereleri için Dosya menüsünde Çıkış öğesi.

  • Genellikle ikincil bir uygulama penceresi için Dosya menüsünde Çıkış öğesi.

  • Genellikle kalıcı bir iletişim kutusunda bulunan İptal düğmesi.

  • Genellikle modsuz iletişim kutusunda bulunan Kapat düğmesi.

Bu özel mekanizmalardan birine yanıt olarak bir pencereyi kapatmak için Close yöntemini çağırmanız gerekir. Aşağıdaki örnek, Dosya menüsünden Çıkış'ı seçerek bir pencereyi kapatma özelliğini uygular.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.WindowWithFileExit">
  
  <Menu>
    <MenuItem Header="_File">
      <MenuItem Header="E_xit" Click="fileExitMenuItem_Click" />
    </MenuItem>
  </Menu>
  
</Window>
using System.Windows;

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

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

Imports System.Windows

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

Bir pencere kapatıldığında iki olay tetiklenir: Closing ve Closed.

Closing, pencere kapanmadan önce tetiklenir ve pencere kapatmanın önlenebileceği bir mekanizma sağlar. Pencere kapatmayı önlemenin yaygın nedenlerinden biri, pencere içeriğinin değiştirilmiş veriler içermesidir. Bu durumda, Closing olayı, verilerin kirli olup olmadığını belirlemek ve eğer öyleyse, kullanıcıya verileri kaydetmeden pencereyi kapatmaya devam edip etmeyeceğini veya pencere kapatmayı iptal edip etmeyeceğini sormak için işlenebilir. Aşağıdaki örnekte Closing işlemenin temel yönleri gösterilmektedir.

using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // window

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

        public DataWindow()
        {
            InitializeComponent();
        }

        void documentTextBox_TextChanged(object sender, EventArgs e)
        {
            this.isDataDirty = true;
        }

        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;
                }
            }
        }
    }
}
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

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub documentTextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
            Me.isDataDirty = True
        End Sub

        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

Closing olay işleyicisi, bir pencerenin kapanmasını önlemek için true olarak ayarladığınız BooleanCancel özelliğini uygulayan bir CancelEventArgs iletilir.

İşlenmezse Closing veya işlenirse ancak iptal edilmediyse, pencere kapanır. Bir pencere kapanmadan hemen önce, Closed tetiklenir. Bu noktada, bir pencerenin kapanması engellenemez.

Dekont

Bir uygulama, ana uygulama penceresi kapatıldığında (bkz. MainWindow) veya son pencere kapandığında otomatik olarak kapatılacak şekilde yapılandırılabilir. Ayrıntılar için bkz. ShutdownMode.

Bir pencere, istemci olmayan ve istemci alanlarında sağlanan mekanizmalar aracılığıyla açık bir şekilde kapatılabilse de, aşağıdakiler de dahil olmak üzere uygulamanın veya Windows'un diğer bölümlerindeki davranışların bir sonucu olarak bir pencere dolaylı olarak kapatılabilir:

  • Kullanıcı Windows oturumlarını veya Windows’u kapattığında.

  • Pencerenin sahibi kapanır (bkz Owner. ).

  • Ana uygulama penceresi kapatıldığında ve ShutdownMode, OnMainWindowClose olduğunda.

  • Shutdown çağrıldığında.

Dekont

Pencere kapatıldıktan sonra yeniden açılamaz.

Pencere Ömrü Olayları

Aşağıdaki çizimde, bir pencerenin ömründeki asıl olayların sırası gösterilmektedir:

Diagram that shows events in a window's lifetime.

Aşağıdaki çizimde, etkinleştirme olmadan gösterilen (ShowActivated, pencere gösterilmeden önce false olarak ayarlanmış) bir pencerenin ömründeki asıl olayların sırası gösterilmektedir:

Diagram that shows events in a window's lifetime without activation.

Pencere Konumu

Pencere açıkken, masaüstüne göre x ve y boyutlarında bir konumu vardır. Bu konum, sırasıyla Left ve Top özellikleri incelenerek belirlenebilir. Pencerenin konumunu değiştirmek için bu özellikleri ayarlayabilirsiniz.

WindowStartupLocation özelliğini aşağıdaki WindowStartupLocation numaralandırma değerlerinden biriyle ayarlayarak Window penceresi ilk göründüğünde ilk konumunu da belirtebilirsiniz:

Başlangıç konumu olarak Manualbelirtilirse ve LeftTop özellikleri ayarlanmamışsa, Window Windows'dan içinde görünecek bir konum ister.

En ÜstTeki Windows ve Z Düzeni

X ve y konumuna sahip olmasının yanı sıra, bir pencerenin z boyutunda da bir konumu vardır ve bu da diğer pencerelere göre dikey konumunu belirler. Bu, pencerenin z sırası olarak bilinir ve iki tür vardır: normal z sırası ve en üstteki z sırası. Bir pencerenin normal z düzenindeki konumu, şu anda etkin olup olmadığına göre belirlenir. Varsayılan olarak, bir pencere normal z düzeninde bulunur. Bir pencerenin en üstteki z düzenindeki konumu da şu anda etkin olup olmadığına göre belirlenir. Ayrıca, en üstteki z düzenindeki pencereler her zaman normal z düzenindeki pencerelerin üzerinde bulunur. Bir pencere, Topmost özelliğini true olarak ayarlayarak en üstteki z düzeninde bulunur.

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

Her z sırası içinde, etkin olan pencere aynı z sırasına göre diğer tüm pencerelerin üzerinde görünür.

Pencere Boyutu

Bir masaüstü konumuna sahip olmanın yanı sıra, bir pencerenin çeşitli genişlik ve yükseklik özellikleri ve SizeToContent gibi çeşitli özellikler tarafından belirlenen bir boyutu vardır.

MinWidth, Widthve MaxWidth bir pencerenin ömrü boyunca sahip olabileceği genişlik aralığını yönetmek için kullanılır ve aşağıdaki örnekte gösterildiği gibi yapılandırılır.

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

Pencere yüksekliği , , Heightve tarafından MaxHeightyönetilir MinHeightve aşağıdaki örnekte gösterildiği gibi yapılandırılır.

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

Çeşitli genişlik değerleri ve yükseklik değerlerinin her biri bir aralık belirttiğinden, yeniden boyutlandırılabilir bir pencerenin genişliği ve yüksekliğinin ilgili boyut için belirtilen aralık içinde herhangi bir yerde olması mümkündür. Geçerli genişliğini ve yüksekliğini algılamak için sırasıyla ActualWidth ve ActualHeight öğelerini inceleyin.

Pencerenizin genişliğinin ve yüksekliğinin, pencere içeriğinin boyutuna uygun bir boyuta sahip olmasını istiyorsanız, aşağıdaki değerlere sahip SizeToContent özelliğini kullanabilirsiniz:

  • Manual. Efekt yok (varsayılan).

  • Width. İçerik genişliğine uydur; bu, içeriğin hem MinWidth hem de MaxWidth genişliğinin ayarlanmasıyla aynı etkiye sahiptir.

  • Height. İçerik yüksekliğine uydur; bu, içeriğin hem MinHeight hem de MaxHeight yüksekliğinin ayarlanmasıyla aynı etkiye sahiptir.

  • WidthAndHeight. İçeriğin hem genişliğine hem de yüksekliğine uydurmak, hem MinHeight hem de MaxHeight öğesini içeriğin yüksekliğine ve hem MinWidth hem de MaxWidth öğesini içeriğin genişliğine ayarlamakla aynı etkiye sahiptir.

Aşağıdaki örnekte, ilk gösterildiğinde içeriğine hem dikey hem de yatay olarak uyacak şekilde otomatik olarak boyutlandırılan bir pencere gösterilmektedir.

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

Aşağıdaki örnekte, bir pencerenin içeriğine uyacak şekilde nasıl yeniden boyutlandırıldığını belirtmek için koddaki SizeToContent özelliğinin nasıl ayarlanacağı gösterilmektedir.


// Manually alter window height and width
this.SizeToContent = SizeToContent.Manual;

// Automatically resize width relative to content
this.SizeToContent = SizeToContent.Width;

// Automatically resize height relative to content
this.SizeToContent = SizeToContent.Height;

// Automatically resize height and width relative to content
this.SizeToContent = SizeToContent.WidthAndHeight;

' Manually alter window height and width
Me.SizeToContent = SizeToContent.Manual

' Automatically resize width relative to content
Me.SizeToContent = SizeToContent.Width

' Automatically resize height relative to content
Me.SizeToContent = SizeToContent.Height

' Automatically resize height and width relative to content
Me.SizeToContent = SizeToContent.WidthAndHeight

Boyutlandırma Özellikleri için Öncelik Sırası

Temelde, bir pencerenin çeşitli boyut özellikleri, yeniden boyutlandırılabilir bir pencerenin genişlik ve yükseklik aralığını tanımlamak için birleştirilir. Geçerli bir aralığın korunduğundan emin olmak için, Window aşağıdaki öncelik sıralarını kullanarak boyut özelliklerinin değerlerini değerlendirir.

Yükseklik Özellikleri için:

  1. FrameworkElement.MinHeight

  2. FrameworkElement.MaxHeight

  3. SizeToContent.Height/SizeToContent.WidthAndHeight

  4. FrameworkElement.Height

Genişlik Özellikleri için:

  1. FrameworkElement.MinWidth

  2. FrameworkElement.MaxWidth

  3. SizeToContent.Width/SizeToContent.WidthAndHeight

  4. FrameworkElement.Width

Öncelik sırası, özelliğiyle WindowState yönetilen ekranı kapladığında pencerenin boyutunu da belirleyebilir.

Pencere Durumu

Yeniden boyutlandırılabilir pencerenin ömrü boyunca üç durum olabilir: normal, simge durumuna küçültülmüş ve ekranı kaplamış. Normal duruma sahip bir pencere, pencerenin varsayılan durumudur. Bu duruma sahip bir pencere, kullanıcının yeniden boyutlandırılabilirse, yeniden boyutlandırma tutamacı veya kenarlık kullanarak bu pencereyi taşımasına ve yeniden boyutlandırmasına olanak tanır.

Simge durumuna küçültülmüş duruma sahip bir pencere, olarak ayarlanırsa ShowInTaskbartruegörev çubuğu düğmesine daraltılır; aksi takdirde, mümkün olan en küçük boyuta daraltılır ve masaüstünün sol alt köşesine yeniden yerleştirilir. Görev çubuğunda gösterilmeyen simge durumuna küçültülmüş bir pencere, masaüstünün etrafında sürüklense de, simge durumuna küçültülmüş pencere türü kenarlık veya yeniden boyutlandırma tutamacı kullanılarak yeniden boyutlandırılamaz.

Ekranı kaplamış duruma sahip bir pencere, olabileceği en büyük boyuta kadar genişler; bu boyut yalnızca MaxWidth, MaxHeight ve SizeToContent özelliklerinin dikte ettiği kadar büyük olur. Simge durumuna küçültülmüş bir pencere gibi, ekranı kaplamış bir pencere de yeniden boyutlandırma tutamacı kullanılarak veya kenarlığın sürüklenerek yeniden boyutlandırılamaz.

Dekont

Pencerenin Top, Left, Width ve Height özelliklerinin değerleri, pencere o anda ekranı kaplamış veya simge durumuna küçültülmüş olsa bile her zaman normal durum değerlerini temsil eder.

Bir pencerenin durumu, aşağıdaki WindowState numaralandırma değerlerinden birine sahip olabilecek WindowState özelliği ayarlanarak yapılandırılabilir:

Aşağıdaki örnekte, açıldığında ekranı kaplamış olarak gösterilen bir pencerenin nasıl oluşturulacağı gösterilmektedir.

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

Genel olarak, bir pencerenin ilk durumunu yapılandıracak şekilde WindowState öğesini ayarlamanız gerekir. Yeniden boyutlandırılabilir bir pencere gösterildikten sonra, kullanıcılar pencere durumunu değiştirmek için pencerenin başlık çubuğundaki simge durumuna küçült, ekranı kapla ve geri yükle düğmelerine basabilir.

Pencere Görünümü

Pencereye düğmeler, etiketler ve metin kutuları gibi pencereye özgü içerik ekleyerek pencerenin istemci alanının görünümünü değiştirebilirsiniz. İstemci olmayan alanı yapılandırmada Window, bir pencerenin simgesini ayarlamak için Icon ve başlığını ayarlamak için Title içeren çeşitli özellikler sağlar.

Ayrıca, bir pencerenin yeniden boyutlandırma modunu, pencere stilini ve masaüstü görev çubuğunda bir düğme olarak görünüp görünmeyeceğini yapılandırarak istemci dışı alan kenarlarının görünümünü ve davranışını değiştirebilirsiniz.

Yeniden Boyutlandırma Modu

Özelliğine WindowStyle bağlı olarak, kullanıcıların pencereyi nasıl yeniden boyutlandırabileceğini (ve olup olmadığını) denetleyebilirsiniz. Pencere stili seçimi, kullanıcının fareyle kenarlığını sürükleyerek pencereyi yeniden boyutlandırıp boyutlandıramayacağını, istemci dışı alanda Simge Durumuna Küçült, Ekranı Kapla ve Yeniden Boyutlandır düğmelerinin görünup görünmediğini ve görünürse etkin olup olmadıklarını etkiler.

Aşağıdaki ResizeMode numaralandırma değerlerinden biri olabilecek ResizeMode özelliğini ayarlayarak pencerenin yeniden boyutlandırılma şeklini yapılandırabilirsiniz:

WindowStyle ile olduğu gibi, bir pencerenin yeniden boyutlandırma modunun, kullanım ömrü boyunca değişme olasılığı düşüktür, bu da büyük olasılıkla XAML işaretlemesinden ayarlayacağınız anlamına gelir.

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

WindowState özelliğini inceleyerek pencerenin ekranı kaplayıp kaplamadığını, simge durumuna küçültüldüğünü veya geri yüklendiğini algılayabileceğinizi unutmayın.

Pencere Stili

Pencerenin istemci olmayan alanından gösterilen kenarlık çoğu uygulama için uygundur. Ancak, pencerenin türüne bağlı olarak farklı kenarlık türlerinin gerekli olduğu veya hiç kenarlığın gerek olmadığı durumlar vardır.

Bir pencerenin ne tür bir kenarlık aldığını denetlemek için, onun WindowStyle özelliğini WindowStyle numaralandırmasının aşağıdaki değerlerinden biriyle ayarlarsınız:

Bu pencere stillerinin etkisi aşağıdaki şekilde gösterilmiştir:

Illustration of window border styles.

XAML işaretlemesini veya kodu kullanarak ayarlayabilirsiniz WindowStyle ; pencerenin ömrü boyunca değişme olasılığı düşük olduğundan, bunu büyük olasılıkla XAML işaretlemesi kullanarak yapılandırırsınız.

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

Dikdörtgen Olmayan Pencere Stili

Ayrıca, sahip olmanıza izin veren kenarlık stillerinin WindowStyle yeterli olmadığı durumlar da vardır. Örneğin, Microsoft Windows Media Player'ın kullandığı gibi dikdörtgen olmayan kenarlıklı bir uygulama oluşturmak isteyebilirsiniz.

Örneğin, aşağıdaki şekilde gösterilen konuşma balonu penceresini göz önünde bulundurun:

A speech bubble window that says Drag Me.

Bu tür bir pencere, WindowStyle özelliği None olarak ayarlanarak ve Window öğesinin şeffaflık için sahip olduğu özel destek kullanılarak oluşturulabilir.

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

Bu değer bileşimi pencereye tamamen saydam işlemesini emreder. Bu durumda, pencerenin istemci dışı alan süslemeleri (Kapat menüsü, Simge Durumuna Küçült, Ekranı Kapla ve Geri Yükle düğmeleri vb.) kullanılamaz. Sonuç olarak, kendiniz sağlamanız gerekir.

Görev Çubuğu İletişim Durumu

Pencerenin varsayılan görünümü, aşağıdaki şekilde gösterilen görev çubuğu düğmesi gibi bir görev çubuğu düğmesi içerir:

Screenshot that shows a window with a taskbar button.

İleti kutuları ve iletişim kutuları gibi bazı pencere türlerinin görev çubuğu düğmesi yoktur (bkz. İletişim Kutularına Genel Bakış). Özelliğini ayarlayarak (true varsayılan olarak) bir pencerenin görev çubuğu düğmesinin ShowInTaskbar gösterilip gösterilmeyebileceğini denetleyebilirsiniz.

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

Güvenlikle İlgili Dikkat Edilmesi Gerekenler

WindowUnmanagedCode örneği oluşturulacak güvenlik izni gerektirir. Yerel makinede yüklü ve yerel makineden başlatılan uygulamalar için bu, uygulamaya verilen izin kümesine girer.

Ancak bu, ClickOnce kullanılarak İnternet veya Yerel intranet bölgesinden başlatılan uygulamalara verilen izin kümesinin dışında kalır. Sonuç olarak, kullanıcılar bir ClickOnce güvenlik uyarısı alır ve uygulamanın izin kümesini tam güvene yükseltmeleri gerekir.

Ayrıca, XBAP'ler varsayılan olarak pencereleri veya iletişim kutularını gösteremez. Tek başına uygulama güvenliği konusunda dikkat edilmesi gerekenler hakkında bir tartışma için bkz . WPF Güvenlik Stratejisi - Platform Güvenliği.

Diğer Windows Türleri

NavigationWindow gezinilebilir içeriği barındırmak için tasarlanmış bir penceredir. Daha fazla bilgi için bkz . Gezintiye Genel Bakış).

İletişim kutuları genellikle bir işlevi tamamlamak için kullanıcıdan bilgi toplamak üzere kullanılan pencerelerdir. Örneğin, bir kullanıcı bir dosyayı açmak istediğinde, dosya adını kullanıcıdan almak için genellikle bir uygulama tarafından Dosya Aç iletişim kutusu görüntülenir. Daha fazla bilgi için, bkz. İletişim Kutularına Genel Bakış.

Ayrıca bkz.