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:
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
öğesininx: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 birpartial
sınıf oluşturmasınax: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şturulanpartial
sınıfı, olayları kaydetmek ve işaretlemede uygulanan özellikleri ayarlamak için çağrılanInitializeComponent
yöntemini uygular.Arka plan kodda sınıf, işaretlemede
x:Class
özniteliği tarafından belirtilen aynı ada sahip birpartial
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ıflapartial
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şturulanpartial
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ğ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ı false
olarak 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 Boolean
Cancel ö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:
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:
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:
CenterOwner (varsayılan)
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:
Genişlik Özellikleri için:
Ö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 ShowInTaskbartrue
gö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:
CanResize (varsayılan)
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:
SingleBorderWindow (varsayılan)
Bu pencere stillerinin etkisi aşağıdaki şekilde gösterilmiştir:
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:
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:
İ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.
.NET Desktop feedback