WPF Windows 'a genel bakış (WPF .NET)

kullanıcılar Windows aracılığıyla Windows Presentation Foundation (WPF) uygulamalarıyla etkileşime geçer. Bir pencerenin birincil amacı, verileri görselleştirerek kullanıcıların verilerle etkileşime geçmesini sağlayan içeriği barındırmak için kullanılır. WPF uygulamaları, sınıfını kullanarak kendi pencerelerini sağlar Window . Bu makale Window , uygulamalarda Windows oluşturma ve yönetme temellerini kapsamadan önce tanıtılmıştır.

Önemli

Bu makalede bir C# PROJESINDEN oluşturulan xaml kullanılmaktadır. Visual Basickullanıyorsanız XAML, biraz farklı görünebilir. Bu farklılıklar genellikle x:Class öznitelik değerlerinde bulunur. C#, Visual Basic olmadığı sırada projenin kök ad alanını içerir.

C# için proje şablonları AppApp dosyasında yer alan bir tür oluşturur. Visual Basic, tür olarak adlandırılır Application ve dosya adlandırılır Application.xaml .

Pencere sınıfı

WPF 'de, bir pencere, Window aşağıdakileri yapmak için kullandığınız sınıfa göre kapsüllenir:

  • Bir pencere görüntüleyin.
  • Pencerenin boyutunu, konumunu ve görünümünü yapılandırın.
  • Uygulamaya özgü içeriği barındırın.
  • Pencerenin ömrünü yönetin.

Aşağıdaki şekilde pencerenin yapısal kısımları gösterilmektedir:

Screenshot that shows parts of a WPF window.

Bir pencere iki alana ayrılmıştır: istemci olmayan alan ve istemci alanı.

Bir pencerenin istemci olmayan alanı WPF tarafından uygulanır ve aşağıdakiler dahil olmak üzere çoğu Windows için ortak olan bir pencerenin parçalarını içerir:

  • Başlık çubuğu (1-5).
  • Bir simge (1).
  • Başlık (2).
  • Simge durumuna küçült (3), Ekranı Kapla (4) ve Close (5) düğmeleri.
  • Menü öğeleriyle sistem menüsü (6). Simgeye tıkladığınızda görünür (1).
  • Kenarlık (7).

Pencerenin istemci alanı , bir pencerenin istemci olmayan alanındaki alanıdır ve geliştiriciler tarafından menü çubukları, araç çubukları ve denetimler gibi uygulamaya özgü içerik eklemek için kullanılır.

  • İstemci alanı (8).
  • Yeniden boyutlandırma tutamacı (9). Bu, Istemci alanına (8) eklenen bir denetimdir.

Pencereyi gerçekleştirme

Tipik bir pencerenin uygulanması, görünümü ve davranışı içerir. burada Görünüm , bir pencerenin kullanıcılara nasıl göründüğünü ve davranışın Kullanıcı tarafından etkileşimde bulunduğu bir pencere işlevleri olduğunu tanımlar. WPF 'de, kod ya da XAML işaretlemesini 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 plan kodu kullanılarak uygulanır.

<Window x:Class="WindowsOverview.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowsOverview"
        >

    <!-- Client area containing the content of the window -->
    
</Window>

Aşağıdaki kod, XAML için arka plan kod.

using System.Windows;

namespace WindowsOverview
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }
}
Public Class Window1

End Class

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

  • Biçimlendirme ' de, Window öğesi x:Class özniteliğini içermelidir. uygulama oluşturulduğunda özniteliğin varlığı, x:Class Microsoft build engine 'in (MSBuild) partialWindow özniteliği tarafından belirtilen adla türetilen bir sınıf oluşturmasına neden olur x:Class . Bu, XAML şeması () için bir XML ad alanı bildiriminin eklenmesini gerektirir xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" . Oluşturulan partial sınıf, InitializeComponent olayları kaydetmek ve biçimlendirmede uygulanan özellikleri ayarlamak için çağrılan yöntemini uygular.

  • Arka plan kod içinde, sınıf, partial biçimlendirme içindeki özniteliği tarafından belirtilen aynı ada sahip bir sınıf olmalıdır x:Class ve ' den türetmelidir Window . Bu, arka plan kod dosyasının, partial uygulama oluşturulduğunda işaretleme dosyası için oluşturulan sınıfla ilişkilendirilmesini sağlar. daha fazla bilgi için bkz. partial.

  • Arka plan kod içinde, Window sınıfının yöntemini çağıran bir Oluşturucu uygulaması gerekir InitializeComponent . InitializeComponent , biçimlendirme dosyasının oluşturulan partial sınıfı tarafından olayları kaydetmek ve biçimlendirmede tanımlanan özellikleri ayarlamak için uygulanır.

Not

Visual Studio kullanarak projenize yeni bir eklediğinizde, WindowWindow her iki biçimlendirme ve arka plan kodu kullanılarak uygulanır ve burada açıklanan biçimlendirme ve arka plan kod dosyaları arasındaki ilişkiyi oluşturmak için gerekli yapılandırmayı içerir.

Bu yapılandırma yerinde olduğunda, XAML biçimlendirmesinde pencerenin görünümünü tanımlamaya ve davranışını arka plan kod içinde uygulamaya odaklanırsınız. Aşağıdaki örnek, olay için bir olay işleyicisi tanımlayan bir düğme içeren bir pencere gösterir Click . Bu, XAML 'de uygulanır ve işleyici arka plan kod içinde uygulanır.

<Window x:Class="WindowsOverview.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowsOverview"
        >

    <!-- Client area containing the content of the window -->

    <Button Click="Button_Click">Click This Button</Button>
    
</Window>

Aşağıdaki kod, XAML için arka plan kod.

using System.Windows;

namespace WindowsOverview
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Button was clicked.");
        }
    }
}
Public Class Window1

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        MessageBox.Show("Button was clicked.")
    End Sub

End Class

MSBuild için pencere yapılandırma

Pencerenizi nasıl uyguladığınız, MSBuild için nasıl yapılandırıldığını belirler. Hem XAML biçimlendirmesi hem de arka plan kodu kullanılarak tanımlanan bir pencere için:

  • XAML işaretleme dosyaları MSBuild öğesi olarak yapılandırılır Page .
  • arka plan kod dosyaları MSBuild öğesi olarak yapılandırılır Compile .

.NET SDK projeleri sizin için doğru ve öğeleri otomatik olarak içeri aktarır PageCompile ve bunları bildirmeniz gerekmez. Proje WPF için yapılandırıldığında XAML biçimlendirme dosyaları otomatik olarak öğeler olarak içeri aktarılır Page ve karşılık gelen arka plan kod dosyası olarak içeri aktarılır Compile .

MSBuild projeler, türleri otomatik olarak içeri aktarmayacaktır ve bunları kendiniz bildirmeniz gerekir:

<Project>
    ...
    <Page Include="MarkupAndCodeBehindWindow.xaml" />
    <Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
    ...
</Project>

WPF uygulamaları oluşturma hakkında daha fazla bilgi için bkz. WPF uygulaması derleme.

Pencere ömrü

Herhangi bir sınıfta olduğu gibi, bir pencere ilk kez başlatıldığında başlayan, açıldıktan sonra, etkin/devre dışı bırakılmış ve sonunda kapatılan bir yaşam süresine sahiptir.

Pencere açma

Bir pencereyi açmak için önce bir örneğini oluşturun ve bu örnek aşağıdaki örnekte gösterilmiştir:

using System.Windows;

namespace WindowsOverview
{
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            // Create the window
            Window1 window = new Window1();

            // Open the window
            window.Show();
        }
    }
}
Class Application

    Private Sub Application_Startup(sender As Object, e As StartupEventArgs)
        ' Create the window
        Dim window As New Window1

        ' Open the window
        window.Show()
    End Sub

End Class

Bu örnekte, Window1 uygulama başladığında, olay oluştuğunda oluşan örneği oluşturulur Startup . Başlangıç penceresi hakkında daha fazla bilgi için bkz. ana uygulama penceresini alma veya ayarlama.

Bir pencere oluşturulduğunda, nesnesi tarafından yönetilen bir Windows listesine otomatik olarak eklenir . Örnek oluşturulacak ilk pencere otomatik olarak ApplicationApplicationolarak ayarlanır.

Bu pencere son olarak Show yöntemi aşağıdaki görüntüde gösterildiği gibi çağırarak açılır:

WPF Window with a single button inside.

Çağırarak açılan bir pencere Show , Show olmayan bir pencere ve uygulama kullanıcıların uygulamadaki diğer pencereler ile etkileşime engel olmaz. Bir pencerenin birlikte açılması, ShowDialog pencereyi ShowDialog olarak açar ve kullanıcı etkileşimini belirli bir pencereyle kısıtlar. Daha fazla bilgi için bkz. Iletişim kutularına genel bakış.

ShowÇağrıldığında, bir pencere, Kullanıcı girişi almasına izin veren bir altyapı oluşturmak için görüntülenmeden önce çalışır. Pencere başlatıldığında SourceInitialized olay tetiklenir ve pencere görüntülenir.

Daha fazla bilgi için bkz. pencere veya iletişim kutusu açma.

Başlangıç penceresi

Önceki örnek, Startup ilk uygulama penceresini görüntülenen kodu çalıştırmak için olayını kullandı. Bunun yerine, bir kısayol olarak, StartupUri uygulamanızda BIR xaml dosyasının yolunu belirtmek için kullanın. Uygulama, bu özellik tarafından belirtilen pencereyi otomatik olarak oluşturur ve görüntüler.

<Application x:Class="WindowsOverview.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WindowsOverview"
             StartupUri="ClippedWindow.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

Pencere sahipliği

Yöntemi kullanılarak açılan bir pencere, Show onu oluşturan pencereyle örtük bir ilişkiye sahip değildir. Kullanıcılar, herhangi bir pencereden bağımsız olarak etkileşime girebilir, yani her iki pencere de şunları yapabilir:

  • Diğerini (pencerelerin bir Topmost özelliği olarak ayarlanmış değilse true ) kapsar.
  • Diğerini etkilemeden simge durumuna küçültülmüş, ekranı kaplamış ve geri yüklenmiş olmalıdır.

Bazı pencereler, açan pencereyle bir ilişki gerektirir. Örneğin, tümleşik bir geliştirme ortamı (IDE) uygulaması, normal davranışı kendilerini oluşturan pencereyi kapsayan özellik pencerelerini ve araç pencerelerini açabilir. Ayrıca, bu gibi pencerelerin her zaman, bunları oluşturan pencereyle birlikte her zaman kapatmaları, en üst düzeye çıkarması ve geri yüklenmesi gerekir. Bu tür bir ilişki, bir pencere diğeri tarafından oluşturulabilir ve sahip pencerenin özelliği sahip penceresinebir başvuru olarak ayarlanarak elde edilebilir . Bu, aşağıdaki örnekte gösterilir.

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Create a window and make the current window its owner
    var ownedWindow = new ChildWindow1();
    ownedWindow.Owner = this;
    ownedWindow.Show();
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    ' Create a window and make the current window its owner
    Dim ownedWindow As New ChildWindow1
    ownedWindow.Owner = Me
    ownedWindow.Show()
End Sub

Sahiplik kurulduktan sonra:

  • Sahibi olan pencere, özelliğinin değerini inceleyerek sahip penceresine başvurabilir Owner .
  • Sahip penceresi, özelliğinin değerini inceleyerek sahip olduğu tüm pencereleri bulabilir OwnedWindows .

Pencere etkinleştirme

Bir pencere ilk açıldığında etkin pencere olur. Etkin pencere , anahtar vuruşları ve fare tıklamaları gibi şu anda Kullanıcı girişi yakalama penceresidir. Bir pencere etkin olduğunda Activated olayı başlatır.

Not

Bir pencere ilk açıldığında, Loaded ve ContentRendered olayları yalnızca olay oluşturulduktan sonra tetiklenir Activated . Bu şekilde aklınızda, bir pencere başlatıldığında açık olarak kabul edilebilir ContentRendered .

Bir pencere etkin olduktan sonra, Kullanıcı aynı uygulamadaki başka bir pencereyi etkinleştirebilir veya başka bir uygulamayı etkinleştirebilir. Bu durumda, etkin olan pencere devre dışı bırakılır ve Deactivated olayı başlatır. Benzer şekilde, Kullanıcı şu anda devre dışı bırakılmış bir pencere seçtiğinde pencere yeniden etkin hale gelir ve Activated oluşturulur.

İşlemenin yaygın bir nedeni Activated ve Deactivated yalnızca bir pencere etkin olduğunda çalışabilen işlevselliği etkinleştirmek ve devre dışı bırakmak. Örneğin, bazı pencereler, Oyunlar ve video oynatıcılar dahil olmak üzere sabit Kullanıcı girişi veya ilgilenilmesi gereken etkileşimli içeriği görüntüler. Aşağıdaki örnek, bu davranışın nasıl işleneceğini ve uygulanacağını gösteren basitleştirilmiş bir video oynatıcı örneğidir ActivatedDeactivated .

<Window x:Class="WindowsOverview.CustomMediaPlayerWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Activated="Window_Activated"
        Deactivated="Window_Deactivated"
        Title="CustomMediaPlayerWindow" Height="450" Width="800">
    <Grid>
        <MediaElement x:Name="mediaElement" Stretch="Fill"
                      LoadedBehavior="Manual" Source="numbers.mp4" />
    </Grid>
</Window>

Aşağıdaki kod, XAML için arka plan kod.

using System;
using System.Windows;

namespace WindowsOverview
{
    public partial class CustomMediaPlayerWindow : Window
    {
        public CustomMediaPlayerWindow() =>
            InitializeComponent();

        private void Window_Activated(object sender, EventArgs e)
        {
            // Continue playing media if window is activated
            mediaElement.Play();
        }

        private void Window_Deactivated(object sender, EventArgs e)
        {
            // Pause playing if media is being played and window is deactivated
            mediaElement.Pause();
        }
    }
}
Public Class CustomMediaPlayerWindow
    Private Sub Window_Activated(sender As Object, e As EventArgs)
        ' Continue playing media if window Is activated
        mediaElement.Play()
    End Sub

    Private Sub Window_Deactivated(sender As Object, e As EventArgs)
        ' Pause playing if media is being played and window is deactivated
        mediaElement.Pause()
    End Sub
End Class

Bir pencere devre dışı bırakıldığında diğer uygulama türleri de arka planda kod çalıştırabilir. Örneğin, bir posta istemcisi, Kullanıcı başka uygulamalar kullanırken posta sunucusunu yoklamaya devam edebilir. Bunlar gibi uygulamalar, ana pencere devre dışı bırakıldığında farklı veya ekstra bir davranış sağlar. Bir posta programı için, bu durum hem gelen kutusuna yeni posta öğesini ekleme hem de sistem tepsisine bir bildirim simgesi ekleme anlamına gelebilir. Bildirim simgesi yalnızca posta penceresi etkin olmadığında, özelliği incelenirken belirlenir IsActive .

Bir arka plan görevi tamamlanırsa, bir pencere, metodu çağırarak kullanıcıya daha akıllıca bildirimde bulunmasını isteyebilir Activate . Kullanıcı çağrıldığında etkinleştirilen başka bir uygulamayla etkileşim kurmaktadır Activate , pencerenin görev çubuğu düğmesi yanıp sönmelidir. Ancak, bir Kullanıcı geçerli uygulamayla etkileşim Activate kursunsam, çağıran pencereyi ön plana getirir.

Not

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

Windows etkinleştirmesini önler

Bir sohbet uygulamasının konuşma pencereleri veya bir e-posta uygulamasının bildirim pencereleri gibi, gösterildiğinde Windows 'un etkinleştirilmemesi gereken senaryolar vardır.

Uygulamanızda, gösterildiğinde etkinleştirilmemelidir bir pencere varsa, ShowActivatedfalse yöntemi ilk kez çağrılmadan önce özelliğini olarak ayarlayabilirsiniz Show . Sonuç olarak:

  • Pencere etkin değil.
  • Pencerenin Activated olayı oluşturulmaz.
  • Etkin durumda olan pencere etkin kalır.

Ancak, Kullanıcı istemciyi veya istemci dışı alanı tıklatarak etkinleştirdiğinde, pencere etkinleştirilir. Bu durumda:

  • Pencere etkinleştirilir.
  • Pencerenin Activated olayı tetiklenir.
  • Önceden etkinleştirilen pencere devre dışı bırakıldı.
  • DeactivatedDaha sonra pencere ve Activated olayları kullanıcı eylemlerine yanıt olarak beklendiği gibi oluşturulur.

Pencereyi kapatma

Bir pencerenin ömrü, bir kullanıcı tarafından kapandığında bir uca geliyor. Pencere kapatıldıktan sonra yeniden açılamaz. Bir pencere, aşağıdakiler de dahil olmak üzere istemci olmayan alandaki öğeler kullanılarak kapatılabilir:

  • Sistem menüsünün Kapanış öğesi.
  • Alt + F4tuşlarına basın.
  • Kapat düğmesine basma.
  • Düğme özelliği true kalıcı bir pencerede ayarlandığında ESC tuşuna basın.

İstemci alanına, bir pencereyi kapatmak için daha fazla mekanizma sağlayabilirsiniz, daha yaygın olarak şunları içerir:

  • Genellikle ana uygulama pencereleri için Dosya menüsündeki Çıkış öğesi.
  • Dosya menüsünde, genellikle ikincil bir uygulama penceresinde bir Kapanış öğesi.
  • Genellikle kalıcı iletişim kutusunda bir iptal düğmesi.
  • Genellikle kalıcı olmayan iletişim kutusunda Kapat düğmesi.

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

<Window x:Class="WindowsOverview.ClosingWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ClosingWindow" Height="450" Width="800">
    <StackPanel>
        <Menu>
            <MenuItem Header="_File">
                <MenuItem Header="E_xit" Click="fileExitMenuItem_Click" />
            </MenuItem>
        </Menu>
    </StackPanel>
</Window>

Aşağıdaki kod, XAML için arka plan kod.

using System.Windows;

namespace WindowsOverview
{
    public partial class ClosingWindow : Window
    {
        public ClosingWindow() =>
            InitializeComponent();

        private void fileExitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Close the current window
            this.Close();
        }
    }
}
Public Class ClosingWindow
    Private Sub fileExitMenuItem_Click(sender As Object, e As RoutedEventArgs)
        ' Close the current window
        Me.Close()
    End Sub
End Class

Not

Uygulama, ana uygulama penceresi kapandığında (bkz MainWindow .) ya da son pencere kapandığında otomatik olarak kapatılacak şekilde yapılandırılabilir. Daha fazla bilgi için bkz. ShutdownMode.

bir pencere, istemci olmayan ve istemci alanlarında belirtilen mekanizmalar aracılığıyla açıkça kapatılabilir olsa da, bir pencere, uygulamanın diğer bölümlerinde veya Windows bir davranışın sonucu olarak örtük olarak kapatılabilir:

Önemli

Bir pencere kapatıldıktan sonra yeniden açılamaz.

Pencere kapanışını iptal et

Bir pencere kapandığında iki olay oluşturur: Closing ve Closed .

Closing pencere kapandıktan sonra tetiklenir ve pencere kapanışının önlenbileceği bir mekanizma sağlar. Pencere kapanışı önlemediği bir yaygın nedeni, pencere içeriğinin değiştirilen verileri içermi. Bu durumda, Closing verilerin kirli olup olmadığını ve bu durumda kullanıcıdan, verileri kaydetmeden pencereyi kapatmaya devam edip etmediğini veya pencere kapanışını iptal etmeyi isteyip istemediğini sormak için olay işlenebilir. Aşağıdaki örnek, işlemenin önemli yönlerini gösterir Closing .

<Window x:Class="WindowsOverview.DataWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataWindow" Height="450" Width="800"
        Closing="Window_Closing">
    <Grid>
        <TextBox x:Name="documentTextBox" TextChanged="documentTextBox_TextChanged" />
    </Grid>
</Window>

Aşağıdaki kod, XAML için arka plan kod.

using System.Windows;
using System.Windows.Controls;

namespace WindowsOverview
{
    public partial class DataWindow : Window
    {
        private bool _isDataDirty;

        public DataWindow() =>
            InitializeComponent();

        private void documentTextBox_TextChanged(object sender, TextChangedEventArgs e) =>
            _isDataDirty = true;

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // If data is dirty, prompt user and ask for a response
            if (_isDataDirty)
            {
                var result = MessageBox.Show("Document has changed. Close without saving?",
                                             "Question",
                                             MessageBoxButton.YesNo);

                // User doesn't want to close, cancel closure
                if (result == MessageBoxResult.No)
                    e.Cancel = true;
            }
        }
    }
}
Public Class DataWindow

    Private _isDataDirty As Boolean

    Private Sub documentTextBox_TextChanged(sender As Object, e As TextChangedEventArgs)
        _isDataDirty = True
    End Sub

    Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs)

        ' If data is dirty, prompt user and ask for a response
        If _isDataDirty Then
            Dim result = MessageBox.Show("Document has changed. Close without saving?",
                                         "Question",
                                         MessageBoxButton.YesNo)

            ' User doesn't want to close, cancel closure
            If result = MessageBoxResult.No Then
                e.Cancel = True
            End If
        End If

    End Sub
End Class

ClosingOlay işleyicisi CancelEventArgs , bir Canceltrue pencerenin kapatmasını engellemek için olarak ayarladığınız özelliğini uygulayan bir öğesine geçirilir.

Closingİşlenmemişse veya işlenirse, ancak iptal edilmemişse pencere kapanır. Pencerenin gerçekten kapanmadan hemen önce, Closed tetiklenir. Bu noktada, bir pencerenin kapatılması engellenemez.

Pencere yaşam süresi olayları

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

Diagram that shows events in a window's lifetime.

Aşağıdaki çizimde, bir pencerenin kullanım ömrü olmadan gösterilen ( ShowActivated pencere gösterilmeden önce olarak ayarlanır) bir pencerenin ömrü içindeki asıl olayların sırası gösterilmektedir false :

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

Pencere konumu

Bir pencere açıkken, masaüstüne göre x ve y boyutlarında bir konum vardır. Bu konum, Left sırasıyla ve özelliklerini inceleyerek belirlenebilir Top . Pencerenin konumunu değiştirmek için bu özellikleri ayarlayın.

WindowWindowStartupLocation Aşağıdaki sabit listesi değerlerinden biriyle özelliği ayarlayarak ilk göründüğünde bir başlangıç konumunu da belirtebilirsiniz WindowStartupLocation :

Başlangıç konumu olarak belirtilmişse Manual ve Left ve Top özellikleri ayarlanmamışsa, Window işletim sisteminden bir konumun görünmesini ister.

En üstteki pencere ve z düzeni

X ve y konumuna sahip olmanın yanı sıra, bir pencere z boyutunda bir konuma da sahiptir ve bu da diğer pencereler açısından dikey konumunu belirler. Bu, pencerenin z düzeni olarak bilinir ve iki tür vardır: normal z düzeni ve en üstteki z düzeni. Normal z düzeninde pencerenin konumu, şu anda etkin olup olmadığına göre belirlenir. Varsayılan olarak, bir pencere normal z düzeninde bulunur. En üstteki z düzeninde pencerenin konumu, şu anda etkin olup olmadığına göre belirlenir. Ayrıca, en üstteki z düzeninde bulunan pencereler her zaman normal z düzeninde Windows üzerinde bulunur. Bir pencere, özelliği olarak ayarlanarak en üstteki z düzeninde bulunur Topmosttrue .

Her z-Düzen türü içinde, şu anda etkin olan pencere aynı z düzeninde diğer tüm pencerelerin üstünde görünür.

Pencere boyutu

Masaüstü konumuna sahip olmanın yanı sıra, bir pencere çeşitli genişlik ve yükseklik özellikleri de dahil olmak üzere çeşitli özelliklerle belirlenen bir boyuta sahiptir SizeToContent .

MinWidth, Width ve MaxWidth bir pencerenin ömrü boyunca sahip olduğu genişlik aralığını yönetmek için kullanılır.

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

Pencere yüksekliği,, ve tarafından yönetilir MinHeightHeightMaxHeight .

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

Çeşitli genişlik ve yükseklik değerleri her biri bir Aralık belirttiğinden, yeniden boyutlandırılabilir bir pencerenin genişlik ve yüksekliğinin ilgili boyut için belirtilen aralığın her yerinden olması mümkündür. Geçerli genişlik ve yüksekliğini algılamak için ActualWidthActualHeight sırasıyla ve ' yi inceleyin.

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

Aşağıdaki örnek, ilk başta gösterildiği gibi, hem dikey hem de yatay olarak içeriğini sığdırmak için otomatik olarak ölçeklenebilen bir pencere gösterir.

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

Aşağıdaki örnek, SizeToContent bir pencerenin içeriği sığdırmak için nasıl yeniden boyutlandırılacağını belirtmek üzere koddaki özelliğinin nasıl ayarlanacağını gösterir.

// 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 boyutlar ö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 emirlerini 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ği ile yönetilen, ekranı kapladıktan sonra bir pencerenin boyutunu da belirleyebilir WindowState .

Pencere durumu

Yeniden boyutlandırılabilir bir 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, yeniden boyutlandırılabilir bir yeniden boyutlandırma tutamacı veya kenarlık kullanarak, kullanıcının onu taşıyıp yeniden boyutlandırmasını sağlar.

Simge durumuna küçültülmüş bir pencere, olarak ayarlandıysa görev çubuğu düğmesine daraltılır true ; Aksi takdirde, mümkün olan en küçük boyuta daraltır ve masaüstünü masaüstünün sol alt köşesine taşıyabilirsiniz. Simge durumuna küçültülmüş pencere türü, bir kenarlık veya yeniden boyutlandırma tutamacı kullanılarak yeniden boyutlandırılabilir, ancak görev çubuğunda görünmeyen simge durumuna küçültülmüş bir pencere masaüstü etrafında sürüklenebilir.

Ekranı kaplayan bir pencere, en büyük boyuta genişletilir, bu da yalnızca ,, MaxHeight ve SizeToContent özellikleri dikte eder. Simge durumuna küçültülmüş bir pencere gibi, ekranı kaplayan bir pencere yeniden boyutlandırma tutamacı kullanılarak veya kenarlıkları sürükleyerek yeniden boyutlandırılamaz.

Not

Pencerenin,,, TopLeftWidth ve özelliklerinin değerleri, Height pencere şu anda büyütülmüş veya küçültülmüş olsa bile normal durum için her zaman değerleri temsil eder.

Bir pencerenin durumu WindowState , özelliği ayarlanarak yapılandırılabilir ve bu, aşağıdaki WindowState sabit listesi değerlerinden birine sahip olabilir:

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

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

Genel olarak, WindowState bir pencerenin başlangıç durumunu yapılandırmak için ayarlamanız gerekir. Yeniden boyutlandırılabilir bir pencere gösterildiğinde, 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ü

Pencerenin istemci alanının görünümünü, düğme, Etiketler ve metin kutuları gibi pencereye özgü içerik ekleyerek değiştirirsiniz. İstemci dışı alanı yapılandırmak için, WindowIcon bir pencerenin simgesini ayarlamak ve başlığını ayarlamak için dahil olmak üzere çeşitli özellikler sağlar Title .

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

Yeniden boyutlandırma modu

Özelliğine bağlı olarak, WindowStyle kullanıcıların pencereyi yeniden boyutlandırmasını ve ne şekilde olduğunu denetleyebilirsiniz. Pencere stili şunları etkiler:

  • Pencere kenarlığını fareyle sürükleyerek yeniden boyutlandırılmasına izin verin veya izin vermeyin.
  • Simge durumuna küçült, Ekranı Kaplave Kapat düğmelerinin istemci olmayan alanda görüntülenip görüntülenmediğini belirtir.
  • Simge durumuna küçült, Ekranı Kaplave Kapat düğmelerinin etkin olup olmadığı.

ResizeModeAşağıdaki sabit listesi değerlerinden biri olabilecek özelliğini ayarlayarak pencerenin nasıl yeniden boyutlandırılacağını yapılandırabilirsiniz ResizeMode :

' De olduğu gibi WindowStyle , bir pencerenin yeniden boyutlandırma modu ömrü boyunca değişmeyebilir, bu da büyük IHTIMALLE xaml biçimlemesinin üzerinde ayarlayacaksınız.

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

Özelliği inceleyerek pencerenin ekranı kaplayacağını, simge durumuna küçültülmüş veya geri yüklendiğini tespit edebilirsiniz WindowState .

Pencere stili

Pencerenin istemci olmayan alanından gösterilen kenarlık çoğu uygulama için uygundur. Bununla birlikte, farklı tür kenarlıkların gerekli olduğu veya pencere türüne bağlı olarak hiçbir kenarlığı gerekmeyen durumlar vardır.

Pencerenin ne tür kenarlığı kontrol etmek için, WindowStyle özelliğini, numaralandırmanın aşağıdaki değerlerinden biriyle ayarlarsınız WindowStyle :

Bir pencere stili uygulamanın etkisi aşağıdaki görüntüde gösterilmiştir:

Screenshot that shows how WindowStyle affects a window in WPF.

Yukarıdaki görüntüde ve arasında belirgin farklılık gösterilmediğine dikkat edin SingleBorderWindowThreeDBorderWindow . Windows XP 'ye geri döndüğünüzde, ThreeDBorderWindow pencerenin nasıl çizildiğini, istemci alanına 3b kenarlık eklemeyi etkiledi. Windows 7 ' den başlayarak, iki stil arasındaki farklılıklar en az düzeydedir.

WindowStyleXAML biçimlendirmesi veya kodu kullanarak ayarlayabilirsiniz. Bir pencerenin ömrü boyunca değiştirilmesi olası olduğundan, büyük ihtimalle XAML biçimlendirmesi kullanarak yapılandıracaksınız.

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

Dikdörtgen olmayan pencere stili

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

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

Screenshot of a WPF window that has a clipped area and custom shape.

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

<Window x:Class="WindowsOverview.ClippedWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ClippedWindow" SizeToContent="WidthAndHeight"
        WindowStyle="None" AllowsTransparency="True" Background="Transparent">
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="20"/>
        </Grid.RowDefinitions>

        <Rectangle Stroke="#FF000000" RadiusX="10" RadiusY="10"/>
        <Path Fill="White" Stretch="Fill" Stroke="#FF000000" HorizontalAlignment="Left" Margin="15,-5.597,0,-0.003" Width="30" Grid.Row="1" Data="M22.166642,154.45381 L29.999666,187.66699 40.791059,154.54395"/>
        <Rectangle Fill="White" RadiusX="10" RadiusY="10" Margin="1"/>
        
        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="25" Text="Greetings!" TextWrapping="Wrap" Margin="5,5,50,5"/>
        <Button HorizontalAlignment="Right" VerticalAlignment="Top" Background="Transparent" BorderBrush="{x:Null}" Foreground="Red" Content="❌" FontSize="15" />

        <Grid.Effect>
            <DropShadowEffect BlurRadius="10" ShadowDepth="3" Color="LightBlue"/>
        </Grid.Effect>
    </Grid>
</Window>

Bu değer birleşimi, pencereye Saydam işlemesini söyler. Bu durumda, pencerenin istemci olmayan alanı kenarlığı düğmeleri kullanılamaz ve kendinizinkini sağlamanız gerekir.

Görev çubuğu varlığı

Pencerenin varsayılan görünümü bir görev çubuğu düğmesi içerir. Bazı Windows türlerinde, özelliği olarak ayarlanan ileti kutuları, iletişim kutularıveya pencereler gibi bir görev çubuğu düğmesi yoktur ToolWindow . Bir pencerenin görev çubuğu düğmesinin, varsayılan olarak olan özelliği ayarlanarak gösterilip gösterilmeyeceğini kontrol edebilirsiniz ShowInTaskbartrue .

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

Diğer Windows türleri

NavigationWindow , gezinebilir içeriği barındırmak için tasarlanan bir penceredir.

İletişim kutuları, genellikle bir işlevi bir kullanıcıdan tamamlamaya yönelik bilgi toplamak için kullanılan bir Windows. Örneğin, bir Kullanıcı bir dosyayı açmak istediğinde, dosya adını kullanıcıdan almak için Dosya Aç iletişim kutusu bir uygulama tarafından görüntülenir. Daha fazla bilgi için bkz. Iletişim kutularına genel bakış.

Ayrıca bkz.