Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Uživatelé interagují s aplikacemi WPF (Windows Presentation Foundation) prostřednictvím oken. Primárním účelem okna je hostovat obsah, který vizualizuje data a umožňuje uživatelům pracovat s daty. Aplikace WPF poskytují svá vlastní okna prostřednictvím třídy Window. Tento článek představuje Window a následně se věnuje základům vytváření a správy oken v aplikacích.
Důležité
Tento článek používá kód XAML vygenerovaný z projektu C#. Pokud používáte Visual Basic, může XAML vypadat trochu jinak. Tyto rozdíly se obvykle vyskytují u hodnot atributů x:Class
. Jazyk C# obsahuje kořenový obor názvů projektu, zatímco Visual Basic nikoli.
Šablony projektu pro jazyk C# vytvářejí typ App
obsažený v souboru app.xaml. V jazyce Visual Basic má typ název Application
a soubor má název Application.xaml
.
Třída Window
Ve WPF je okno zapouzdřeno Window třídou, kterou používáte k provedení následujících kroků:
- Zobrazení okna
- Nakonfigurujte velikost, umístění a vzhled okna.
- Hostování obsahu specifického pro aplikaci
- Umožňuje spravovat dobu života okna.
Následující obrázek znázorňuje základní části okna:
Okno je rozděleno do dvou oblastí: neklientská oblast a oblast klienta.
WPF implementuje neklientskou oblast okna, která zahrnuje části společné pro většinu oken, včetně následujících:
- Záhlaví (1 až 5)
- Ikona (1)
- Název (2)
- Tlačítka Minimalizovat (3), Maximalizovat (4) a Zavřít (5)
- Systémová nabídka (6) s položkami nabídky Zobrazí se při kliknutí na ikonu (1)
- Okraj (7)
Oblast klienta okna je oblast v oblasti, která není klientem okna, a používá ji vývojáři k přidání obsahu specifického pro aplikaci, jako jsou pruhy nabídek, panely nástrojů a ovládací prvky.
- Klientská oblast (8)
- Úchyt pro změnu velikosti (9) Tento ovládací prvek je přidán do klientské oblasti (8).
Implementace okna
Implementace typického okna zahrnuje vzhled i chování, přičemž vzhled definuje, jak okno vypadá pro uživatele, a chování definuje způsob, jakým okno funguje, když s ním uživatelé pracují. Ve WPF můžete implementovat vzhled a chování okna pomocí kódu nebo kódu XAML.
Obecně se ale vzhled okna implementuje pomocí kódu XAML a jeho chování se implementuje pomocí kódu na pozadí, jak je znázorněno v následujícím příkladu.
<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>
Následující kód je kód na pozadí pro XAML.
using System.Windows;
namespace WindowsOverview
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
}
Public Class Window1
End Class
Pokud chcete povolit spolupráci XAML souboru s označovacím jazykem a souboru s kódem na pozadí, jsou požadovány následující věci:
V kódu musí prvek
Window
obsahovat atributx:Class
. Při sestavování aplikace způsobí existence atributux:Class
, že nástroj MSBuild (Microsoft Build Engine) vygeneruje třídupartial
odvozenou od třídy Window s názvem, který je určen atributemx:Class
. To vyžaduje přidání deklarace oboru názvů XML pro schéma XAML (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
). Vygenerovanápartial
třída implementujeInitializeComponent
metodu, která je volána k registraci událostí a nastavení vlastností implementovaných v kódu.V kódu na pozadí musí být třída
partial
třídou se stejným názvem, který je určen atributemx:Class
ve značkovacím jazyce, a musí dědit z Window. To umožňuje přiřadit soubor s kódem na pozadí ke tříděpartial
, která je vygenerována pro soubor s XAML kódem při sestavování aplikace. Další informace naleznete v části Kompilace aplikace WPF.V kódu na pozadí musí třída Window implementovat konstruktor, který volá metodu
InitializeComponent
.InitializeComponent
je implementována vygenerovanou třídoupartial
souboru značkování pro registraci událostí a nastavení vlastností definovaných ve značkování.
Poznámka:
Když do svého projektu pomocí sady Visual Studio přidáte nový Window, Window se implementuje pomocí značky i kódu na pozadí a zahrnuje potřebnou konfiguraci k vytvoření asociace mezi značkou a soubory s kódem na pozadí, jak je popsáno zde.
S touto konfigurací se můžete zaměřit na definování vzhledu okna v kódu XAML a implementaci jeho chování v kódu. V následujícím příkladu je zobrazeno okno s tlačítkem, které definuje obslužnou rutinu události pro událost Click. To je implementováno v XAML a obslužná rutina je implementována v kódu na pozadí.
<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>
Následující kód je kód na pozadí pro XAML.
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
Konfigurace okna pro Microsoft Build Engine
Způsob implementace okna určuje způsob jeho konfigurace pro MSBuild (Microsoft Build Engine). Pro okno, které je definováno pomocí XAML značkování i kódu:
- Soubory značek XAML jsou nakonfigurovány jako položky MSBuild
Page
. - Soubory za kódem jsou nakonfigurované jako položky nástroje MSBuild
Compile
.
Projekty sady .NET SDK automaticky importují správné Page
a Compile
položky za vás a nemusíte je deklarovat. Když je projekt nakonfigurován pro WPF, soubory s XAML kódem se automaticky importují jako položky Page
a odpovídající soubor s kódem na pozadí se importuje jako Compile
.
Projekty MSBuild neimportují automaticky typy. Musíte je deklarovat sami:
<Project>
...
<Page Include="MarkupAndCodeBehindWindow.xaml" />
<Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
...
</Project>
Informace o sestavování aplikací WPF naleznete v části Kompilace aplikace WPF.
Doba života okna
Stejně jako každá jiná třída má i okno svou životnost, která začíná při vytvoření jeho první instance, po níž je otevřeno, aktivováno/deaktivováno a nakonec zavřeno.
Otevření okna
Pokud chcete otevřít okno, musíte nejprve vytvořit jeho instanci, což je vidět na následujícím příkladu:
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
V tomto příkladu je vytvořena instance Window1
při spuštění aplikace, k čemuž dojde při vyvolání události Startup. Další informace o spouštěcím okně najdete v tématu Jak získat nebo nastavit hlavní okno aplikace.
Při vytvoření instance okna je odkaz na něj automaticky přidán do seznamu oken, který je spravován objektem Application. První okno, jehož instance má být vytvořena, automaticky nastaví Application jako hlavní okno aplikace.
Okno se nakonec otevře voláním metody Show, jak je znázorněno na následujícím obrázku:
Okno otevřené voláním Show je nemodální okno a aplikace nebrání uživatelům v interakci s jinými okny v aplikaci. Otevření okna pomocí ShowDialog otevře okno jako modální a zabrání interakci uživatele s konkrétním oknem. Další informace naleznete v tématu Přehled dialogových oken.
Při volání Show se před zobrazením okna provedou inicializační operace, aby se vytvořila infrastruktura, která mu umožní přijímat vstupy od uživatele. Při inicializaci okna se vyvolá událost SourceInitialized a zobrazí se okno.
Další informace najdete v tématu Jak otevřít okno nebo dialogové okno.
Spouštěcí okno
V předchozím příkladu byl pomocí události Startup
spuštěn kód, který zobrazil úvodní okno aplikace. Místo toho můžete jako zkratku zadat cestu k souboru XAML v aplikaci pomocí StartupUri. Aplikace automaticky vytvoří a zobrazí okno určené touto vlastností.
<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>
Vlastnictví okna
Okno otevřené pomocí metody Show nemá implicitní relaci s oknem, které ho vytvořilo. Uživatelé mohou pracovat s oběma okny nezávisle na sobě, což znamená, že v obou oknech lze provádět následující činnosti:
- Zakryjte ostatní (pokud některá z oken nemá vlastnost Topmost nastavenou na
true
). - Minimalizovat, maximalizovat a obnovit lze, aniž by to mělo vliv na ostatní.
Některá okna vyžadují relaci s oknem, které je otevře. Například aplikace integrovaného vývojového prostředí (IDE) může otevřít okna vlastností a okna nástrojů, jejichž typické chování je pokrytí okna, které je vytvoří. Kromě toho by se tato okna měla vždy zavřít, minimalizovat, maximalizovat a obnovit v souladu s oknem, které je vytvořilo. Takovou relaci lze vytvořit tak, že jedno okno bude vlastnit druhé, čehož se dosáhne nastavením vlastnosti Ownervlastněného okna s odkazem na okno vlastníka. To je znázorněno v následujícím příkladu.
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
Po vytvoření vlastnictví:
- Vlastní okno může odkazovat na okno vlastníka kontrolou hodnoty vlastnosti Owner.
- Okno vlastníka může zjistit všechna okna, která vlastní, kontrolou hodnoty své vlastnosti OwnedWindows.
Aktivace okna
Když se okno poprvé otevře, stane se aktivním oknem. aktivní okno je okno, které aktuálně zaznamenává vstup uživatele, například stisknutí kláves a kliknutí myší. Když se okno aktivuje, vyvolá událost Activated.
Poznámka:
Při prvním otevření okna se události Loaded a ContentRendered vyvolá až po vyvolání události Activated. S ohledem na to lze okno efektivně považovat za otevřené, když je ContentRendered vyvolána.
Po aktivaci okna může uživatel aktivovat jiné okno ve stejné aplikaci nebo aktivovat jinou aplikaci. Když k tomu dojde, aktivní okno se deaktivuje a vyvolá Deactivated událost. Podobně když uživatel vybere aktuálně deaktivované okno, okno se znovu aktivuje a Activated se vyvolá.
Jedním z běžných důvodů, proč zpracovávat Activated a Deactivated, je povolit a zakázat funkce, které se dají spustit jenom v době, kdy je okno aktivní. Některá okna například zobrazují interaktivní obsah, který vyžaduje konstantní vstup uživatele nebo pozornost, včetně her a přehrávačů videa. Následující příklad je zjednodušený video přehrávač, který ukazuje, jak zpracovat Activated a Deactivated, tak aby se implementovalo toto chování.
<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>
Následující kód je kód na pozadí pro XAML.
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
Jiné typy aplikací můžou při deaktivaci okna dál spouštět kód na pozadí. Poštovní klient může například pokračovat v dotazování poštovního serveru, zatímco uživatel používá jiné aplikace. Takové aplikace často v době, kdy je hlavní okno deaktivováno, vykazují odlišné nebo dodatečné chování. V případě poštovního programu to může znamenat jak přidání nové položky pošty do složky doručené pošty, tak přidání ikony oznámení do oznamovací oblasti systému. Oznamovací ikona se musí zobrazit až tehdy, když okno pošty není aktivní, což se zjistí kontrolou vlastnosti IsActive.
Pokud se úloha na pozadí dokončí, okno může uživatele informovat naléhavěji voláním Activate metody. Pokud uživatel pracuje s jinou aplikací aktivovanou při zavolání Activate, tlačítko hlavního panelu okna bliká. Pokud však uživatel interaguje s aktuální aplikací, volání Activate přenese okno do popředí.
Poznámka:
Aktivaci rozsahu aplikace můžete zpracovat pomocí Application.Activated a Application.Deactivated událostí.
Zabránění aktivaci okna
Existují situace, kdy by se okna neměla při zobrazení aktivovat, například okna konverzace v aplikaci pro chat nebo okna oznámení v e-mailové aplikaci.
Pokud má vaše aplikace okno, které by se při prvním zobrazení nemělo aktivovat, můžete jeho vlastnost ShowActivated nastavit na false
před prvním voláním metody Show. V důsledku toho:
- Okno se neaktivuje.
- Není vyvolána událost Activated okna.
- Aktuálně aktivované okno zůstane aktivní.
Okno se stane aktivním, jakmile ho uživatel aktivuje kliknutím na klientskou nebo neklientskou oblast. V tomto případě:
- Okno je aktivováno.
- Událost okna Activated je vyvolána.
- Dříve aktivované okno se deaktivuje.
- V reakci na akce uživatele jsou pak podle očekávání vyvolány události Deactivated a Activated okna.
Zavření okna
Život okna začíná docházet na konec, když ho uživatel zavře. Jakmile je okno zavřeno, nelze ho již znovu otevřít. Okno lze zavřít pomocí prvků v oblasti, která není klientem, včetně následujících:
- Položka
Zavřít nabídky systému. - Stisknutí kláves ALT + F4.
- Stisknutí tlačítka Zavřít.
- Stisknutí klávesy ESC, když je pro tlačítko v modálním okně nastavena vlastnost IsCancel na
true
.
Pro klientskou oblast můžete nastavit více mechanismů pro zavření okna, z nichž nejběžnější jsou následující:
- Položka
Ukončit v nabídce souboru, obvykle pro hlavní okna aplikací. - Položka Zavřít v nabídce Soubor, typicky v sekundárním okně aplikace.
- Tlačítko Zrušit, obvykle na modálním dialogovém okně.
- Tlačítko Zavřít, obvykle v nemodálním dialogovém okně.
Pokud chcete okno zavřít v reakci na některý z těchto vlastních mechanismů, musíte volat metodu Close. Následující příklad implementuje schopnost zavřít okno zvolením možnosti Ukončit z nabídky Soubor.
<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>
Následující kód je kód na pozadí pro XAML.
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
Poznámka:
Aplikaci je možné nakonfigurovat tak, aby se automaticky vypnula, když se zavře hlavní okno aplikace (viz MainWindow) nebo se zavře poslední okno. Další informace najdete v tématu ShutdownMode.
I když je možné okno explicitně uzavřít prostřednictvím mechanismů poskytovaných v jiných klientských a klientských oblastech, okno může být implicitně uzavřeno také v důsledku chování v jiných částech aplikace nebo Windows, včetně následujících:
- Uživatel se odhlásí nebo vypne Systém Windows.
- Zavře se Owner okna.
- Hlavní okno aplikace je zavřeno a ShutdownMode je OnMainWindowClose.
- Shutdown se volá.
Důležité
Okno nelze po zavření znovu otevřít.
Zrušení zavření okna
Když se okno zavře, vyvolá dvě události: Closing a Closed.
Closing je vyvolána před zavřením okna a poskytuje mechanismus, kterým lze zabránit uzavření okna. Jedním z běžných důvodů, proč zabránit zavření okna, je, že obsah okna obsahuje upravená data. V této situaci lze Closing událost zpracovat, aby se zjistilo, jestli jsou data zašpiněná, a pokud ano, požádejte uživatele, zda má pokračovat v zavření okna bez uložení dat nebo zrušení uzavření okna. Následující příklad ukazuje klíčové aspekty zpracování 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>
Následující kód je kód na pozadí pro XAML.
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
Obslužné rutině události Closing je předán parametr CancelEventArgs implementující vlastnost Cancel, kterou jste nastavili na true
, aby se zabránilo zavření okna.
Pokud se událost Closing nezpracuje nebo se zpracuje, ale nezruší se, okno se zavře. Těsně před tím, než se okno skutečně zavře, je vyvoláno Closed. V tomto okamžiku nelze zabránit zavření okna.
Události v průběhu doby života okna
Následující obrázek znázorňuje posloupnost hlavních událostí v době životnosti okna:
Následující obrázek znázorňuje posloupnost hlavních událostí v době životnosti okna, které se zobrazuje bez aktivace (ShowActivated je nastavena na false
před zobrazením okna):
Umístění okna
Když je okno otevřené, má polohu v osách x a y vzhledem k ploše. Toto umístění lze určit kontrolou vlastností Left a Top. Nastavením těchto vlastností můžete změnit umístění okna.
Můžete také určit počáteční umístění Window při prvním zobrazení nastavením vlastnosti WindowStartupLocation s jednou z následujících hodnot výčtu WindowStartupLocation:
- CenterOwner (výchozí)
- CenterScreen
- Manual
Pokud je spouštěcí umístění zadáno jako Manual a nejsou nastaveny vlastnosti Left a Top, Window požádá operační systém o umístění, ve kterém se má zobrazit.
Nejhornější okna a pořadí Z
Kromě umístění x a y má okno také umístění v rozměru z, které určuje jeho svislou polohu s ohledem na ostatní okna. To se označuje jako pořadí Z okna a existují dva typy: normální pořadí Z a nejhornější pořadí Z. Umístění okna v případě normálního pořadí Z je určeno tím, zda je okno právě aktivní, nebo ne. Ve výchozím nastavení se okno nachází v normálním z-pořadí vykreslování. Umístění okna v případě nejhornějšího pořadí Z je také určeno tím, zda je okno právě aktivní, nebo ne. Kromě toho jsou okna v nejvyšším z-řádu vždy umístěna nad okny v normálním z-řádu. Okno je umístěno do nejvyššího z-řádu nastavením jeho vlastnosti Topmost na true
.
V rámci každého typu pořadí Z se aktuálně aktivní okno zobrazuje nad všemi ostatními okny ve stejném pořadí Z.
Velikost okna
Kromě umístění na ploše má okno velikost určenou několika vlastnostmi, včetně různých vlastností šířky a výšky a SizeToContent.
MinWidth, Widtha MaxWidth a slouží ke správě rozsahu šířek, které může mít okno během své doby života.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
MinWidth="300" Width="400" MaxWidth="500">
</Window>
Výška okna je spravována prostřednictvím vlastností MinHeight,Height a MaxHeight.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
MinHeight="300" Height="400" MaxHeight="500">
</Window>
Vzhledem k tomu, že různé hodnoty šířky a výšky určují určitý rozsah, je možné, aby šířka a výška okna s možností změny velikosti byla kdekoli v rámci určeného rozsahu pro příslušný rozměr. Chcete-li zjistit jeho aktuální šířku a výšku, zkontrolujte ActualWidth a ActualHeightv uvedeném pořadí.
Pokud chcete, aby šířka a výška okna měla velikost odpovídající velikosti obsahu okna, můžete použít vlastnost SizeToContent, která má následující hodnoty:
-
SizeToContent.Manual
Žádný efekt (výchozí). -
SizeToContent.Width (Šířka velikosti obsahu)
Přizpůsobit na šířku obsahu, což má stejný účinek jako nastavení MinWidth a MaxWidth na šířku obsahu. -
SizeToContent.Height
Přizpůsobit výšce obsahu, což má stejný účinek jako nastavení MinHeight i MaxHeight na výšku obsahu. -
SizeToContent.WidthAndHeight
Přizpůsobit šířce a výšce obsahu, což má stejný účinek jako nastavení MinHeight i MaxHeight na výšku obsahu a nastavení MinWidth i MaxWidth na šířku obsahu.
Následující příklad ukazuje okno, které automaticky přizpůsobí jeho obsah svisle i vodorovně při prvním zobrazení.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
SizeToContent="WidthAndHeight">
</Window>
Následující příklad ukazuje, jak nastavit vlastnost SizeToContent v kódu tak, aby určovala způsob, jakým se okno přizpůsobuje svému obsahu.
// 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
Pořadí priorit pro vlastnosti velikostí
V podstatě se vlastnosti různých velikostí okna kombinují, aby definovaly rozsah šířky a výšky pro přizpůsobitelné okno. Pokud chcete zajistit zachování platného rozsahu, Window vyhodnotí hodnoty vlastností velikosti pomocí následujících pořadí priorit.
pro vlastnosti výšky:
- FrameworkElement.MinHeight
- FrameworkElement.MaxHeight
- SizeToContent.Height / SizeToContent.WidthAndHeight
- FrameworkElement.Height
pro vlastnosti šířky:
- FrameworkElement.MinWidth
- FrameworkElement.MaxWidth
- SizeToContent.Width / SizeToContent.WidthAndHeight
- FrameworkElement.Width
Pořadí priorit může také určovat velikost okna při jeho maximalizaci, která se spravuje pomocí vlastnosti WindowState.
Stav okna
Během životnosti okna s možností změny velikosti může mít tři stavy: normální, minimalizované a maximalizované. Okno s normálním stavem je výchozím stavem okna. Okno s tímto stavem umožňuje uživateli okno přesouvat a měnit jeho velikost pomocí úchytu pro změnu velikosti nebo přetažením okraje (pokud je možné měnit jeho velikost).
Pokud má okno v minimalizovaném stavu nastavenu vlastnost ShowInTaskbar na hodnotu true
, sbalí se na tlačítko na hlavním panelu, jinak se sbalí na nejmenší možnou velikost a přesune se do levého dolního rohu plochy. Žádný typ minimalizovaného okna nelze změnit pomocí ohraničení nebo úchytu pro změnu velikosti, i když minimalizované okno, které se nezobrazuje na hlavním panelu, lze přetáhnout po ploše.
Okno ve stavu maximalizovaném se rozšíří na maximální velikost, které může dosáhnout, což bude přesně tak velké, jak jeho vlastnosti MaxWidth, MaxHeighta SizeToContent dovolí. Stejně jako u minimalizovaného okna nelze ani u maximalizovaného okna měnit velikost pomocí úchytu pro změnu velikosti ani přetažením okraje.
Poznámka:
Hodnoty Top, Left, Widtha Height vlastností okna vždy představují hodnoty pro normální stav, i když je okno aktuálně maximalizované nebo minimalizované.
Stav okna lze nakonfigurovat nastavením vlastnosti WindowState, která může mít jednu z následujících WindowState hodnot výčtu:
Následující příklad ukazuje, jak vytvořit okno, které se zobrazí jako maximalizované při otevření.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowState="Maximized">
</Window>
Obecně byste měli nastavit WindowState tak, aby nakonfigurovali počáteční stav okna. Po zobrazení okna s možností změny velikosti mohou uživatelé změnit stav okna stisknutím tlačítek Minimalizovat, Maximalizovat a Obnovit v záhlaví okna.
Vzhled okna
Vzhled klientské oblasti okna změníte přidáním obsahu specifického pro okno, jako jsou tlačítka, popisky a textová pole. Pokud chcete nakonfigurovat oblast, která není klientem, Window poskytuje několik vlastností, mezi které patří Icon k nastavení ikony okna a Title nastavit její název.
Vzhled a chování ohraničení mimo klientskou oblast můžete také změnit tak, že nakonfigurujete režim změny velikosti okna, styl okna a to, jestli se zobrazí jako tlačítko na hlavním panelu plochy.
Režim změny velikosti
V závislosti na vlastnosti WindowStyle můžete ovlivnit, zda a jak budou uživatelé moci měnit velikost okna. Styl okna má vliv na následující nastavení:
- Povolení nebo zakázání změny velikosti přetažením okraje okna myší.
- Určuje, jestli se tlačítka Minimalizovat, Maximalizovat a Zavřít zobrazí v neklientské oblasti.
- Určuje, jestli jsou povolena tlačítka Minimalizovat, Maximalizovat a Zavřít.
Způsob změny velikosti okna můžete nakonfigurovat nastavením jeho vlastnosti ResizeMode, což může být jedna z následujících hodnot výčtu ResizeMode:
- NoResize
- CanMinimize
- CanResize (výchozí)
- CanResizeWithGrip
Stejně jako u WindowStylese režim změny velikosti okna pravděpodobně během jeho životnosti nezmění, což znamená, že ho pravděpodobně nastavíte z kódu XAML.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ResizeMode="CanResizeWithGrip">
</Window>
Všimněte si, že pomocí kontroly vlastnosti WindowState můžete zjistit, jestli je okno maximalizované, minimalizované nebo obnovené.
Styl okna
Hraniční čára viditelná z neklientské oblasti okna je vhodná pro většinu aplikací. Existují však okolnosti, kdy jsou potřeba různé typy ohraničení nebo nejsou vůbec potřeba žádné ohraničení v závislosti na typu okna.
Chcete-li kontrolovat, jaký typ ohraničení okno získá, vlastnost WindowStyle nastavte pomocí jedné z následujících hodnot výčtu WindowStyle.
- None
- SingleBorderWindow (výchozí)
- ThreeDBorderWindow
- ToolWindow
Na následujícím obrázku je znázorněn výsledek použití stylu okna:
Všimněte si, že na obrázku výše není patrný žádný znatelný rozdíl mezi SingleBorderWindow
a ThreeDBorderWindow
. V systému Windows XP ovlivňovala vlastnost ThreeDBorderWindow
způsob vykreslování okna přidáním 3D okraje do klientské oblasti. Od systému Windows 7 jsou rozdíly mezi oběma styly minimální.
WindowStyle můžete nastavit pomocí kódu nebo XAML kódu. Vzhledem k tomu, že je nepravděpodobné, že by se v průběhu doby života okna změnila, budete ji s největší pravděpodobností konfigurovat pomocí XAML kódu.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowStyle="ToolWindow">
</Window>
Neobdélníkový styl okna
Existují také situace, kdy styly okrajů, které vlastnost WindowStyle umožňuje mít, nejsou dostatečné. Můžete například chtít vytvořit aplikaci s neúúhledovým ohraničením, jako je microsoft Windows Media Player.
Podívejte se na příklad okna s řečovou bublinou, které vidíte na následujícím obrázku:
Tento typ okna lze vytvořit nastavením vlastnosti WindowStyle na Nonea využitím speciální podpory, kterou Window nabízí pro transparentnost.
<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>
Tato kombinace hodnot dává oknu pokyn k průhlednému vykreslení. V tomto stavu nelze použít ozdobná tlačítka okna, která nejsou v klientské oblasti, a musíte zadat vlastní.
Přítomnost hlavního panelu
Výchozí vzhled okna zahrnuje tlačítko na hlavním panelu. Některé typy oken nemají tlačítko na hlavním panelu, například okna zpráv, dialogová okna nebo okna s vlastností WindowStyle nastavenou na ToolWindow. Nastavením vlastnosti ShowInTaskbar, která má ve výchozím nastavení hodnotu true
, můžete ovlivnit, jestli se tlačítko zobrazí na hlavním panelu okna.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ShowInTaskbar="False">
</Window>
Další typy oken
NavigationWindow je okno, které je určeno k zobrazení navigovatelného obsahu.
Dialogová okna jsou okna, která se často používají ke shromažďování informací od uživatele k dokončení funkce. Když chce například uživatel otevřít soubor, zobrazí aplikace dialogové okno Otevřít soubor, aby od uživatele získala název souboru. Další informace naleznete v tématu Přehled dialogových oken.
Viz také
.NET Desktop feedback