A WPF-ablakok áttekintése (WPF .NET)
A felhasználók windowson keresztül kommunikálnak a Windows Presentation Foundation (WPF) alkalmazásokkal. Az ablak elsődleges célja olyan tartalmakat üzemeltetni, amelyek adatokat jelenítenek meg, és lehetővé teszik a felhasználók számára az adatokkal való interakciót. A WPF-alkalmazások saját ablakokat biztosítanak a Window osztály használatával. Ez a cikk Window ismertet, mielőtt az alkalmazásokban lévő ablakok létrehozásának és kezelésének alapjait ismertetnénk.
Fontos
Ez a cikk egy C# projektből létrehozott XAML-t használ. Ha Visual Basichasznál, az XAML kissé eltérő lehet. Ezek a különbségek általában x:Class
attribútumértékeken vannak jelen. A C# tartalmazza a projekt gyökérnévterét, míg a Visual Basic nem.
A C# projektsablonjai létrehoznak egy App
típust az app.xaml fájlban. A Visual Basicben a típus neve Application
, a fájl neve pedig Application.xaml
.
Az Ablak osztály
A WPF-ben az ablakokat a Window osztály foglalja össze, amelyet a következők végrehajtásához használ:
- Ablak megjelenítése.
- Az ablak méretének, pozíciójának és megjelenésének konfigurálása.
- Alkalmazásban tárolt tartalom.
- Az ablak élettartamának kezelése.
Az alábbi ábra egy ablak összetevőit szemlélteti:
Az ablak két területre oszlik: a nem ügyfélterületre és az ügyfélterületre.
A nem kliens terület egy ablakban a WPF valósítja meg, és magában foglalja az ablak azon részeit, amelyek a legtöbb ablakra jellemzőek, beleértve a következőket:
- Címsor (1-5).
- Ikon (1).
- Cím (2).
- Kis méret (3), Teljes méret (4) és Bezárás (5) gomb.
- Rendszermenü (6) menüelemekkel. Az ikonra (1) kattintva jelenik meg.
- Szegély (7).
Az ablak ügyfélterülete az ablak nem ügyfélterületén belüli terület, és a fejlesztők alkalmazásspecifikus tartalmak, például menüsávok, eszközsávok és vezérlők hozzáadására használják.
- Ügyfélterület (8).
- Fogó átméretezése (9). Ez egy vezérlő, amelyet az ügyfélterülethez (8) adtak hozzá.
Ablak implementálása
A tipikus ablak implementálása magában foglalja a megjelenést és a viselkedést is, ahol megjelenés határozza meg, hogyan néz ki az ablak a felhasználók számára, és viselkedés határozza meg, hogyan működik az ablak, amikor a felhasználók használják azt. A WPF-ben a megjelenést és a viselkedést kód vagy XAML-jelölés használatával implementálhatja egy ablak esetében.
Általában azonban az ablak megjelenése XAML-markup használatával valósul meg, és viselkedése kód-behind segítségével történik, ahogyan az alábbi példában is látható.
<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 következő kód az XAML mögötti kód.
using System.Windows;
namespace WindowsOverview
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
}
Public Class Window1
End Class
Ahhoz, hogy egy XAML-korrektúrafájl és egy kód mögötti fájl működjön együtt, a következőkre van szükség:
A korrektúrában a
Window
elemnek tartalmaznia kell ax:Class
attribútumot. Az alkalmazás létrehozásakor ax:Class
attribútum megléte miatt a Microsoft buildmotorja (MSBuild) létrehoz egypartial
osztályt, amely ax:Class
attribútum által megadott névvel rendelkező Window származik. Ehhez hozzá kell adnunk egy XML-névtér-deklarációt az XAML-sémához (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
). A létrehozottpartial
osztály implementálja aInitializeComponent
metódust, amely az események regisztrálásához és a korrektúra által implementált tulajdonságok beállításához lesz meghívva.A mögöttes kódban az osztálynak olyan
partial
osztálynak kell lennie, amelynek a neve megegyezik a jelölésx:Class
attribútumával, és Window-ből kell származnia. Ez lehetővé teszi, hogy a mögöttes kódfájl az alkalmazás létrehozásakor a korrektúrafájlhoz létrehozottpartial
osztályhoz legyen társítva. További információ: WPF-alkalmazás fordítása.A kód mögötti Window osztálynak olyan konstruktort kell implementálnia, amely meghívja a
InitializeComponent
metódust.InitializeComponent
a markup fájl által létrehozottpartial
osztály implementálva regisztrálja az eseményeket, és beállítja a markupban definiált tulajdonságokat.
Jegyzet
Amikor új Window-t ad hozzá a projekthez a Visual Studio használatával, a Window a jelölőnyelv és a kód mögött használatával van implementálva, és tartalmazza a szükséges konfigurációt a jelölőnyelv és a kód mögötti fájl közötti társítás létrehozásához az itt leírtak szerint.
Ezzel a konfigurációval az ablak XAML jelölésnyelvben való megjelenésének meghatározására és viselkedésének a kódban történő megvalósítására összpontosíthat. Az alábbi példában egy gombot tartalmazó ablak látható, amely meghatározza a Click eseménykezelőt. Ez az XAML-ben van megvalósítva, a kezelő pedig a háttérkódban van implementálva.
<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 következő kód az XAML mögötti kód.
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
Ablak konfigurálása az MSBuildhez
Az ablak implementálása határozza meg, hogyan van konfigurálva az MSBuildhez. XAML-jelölőnyelvvel és kódfájl használatával definiált ablak esetén:
- Az XAML-korrektúrafájlok MSBuild
Page
elemként vannak konfigurálva. - A kód mögötti fájlok MSBuild
Compile
elemként vannak konfigurálva.
A .NET SDK-projektek automatikusan importálják a megfelelő Page
és Compile
elemeket, és ezeket nem kell deklarálnia. Ha a projekt a WPF-hez van konfigurálva, a rendszer automatikusan importálja az XAML-jelölőfájlokat Page
elemként, és a megfelelő mögöttes kódfájlt importálja Compile
.
Az MSBuild-projektek nem importálják automatikusan a típusokat, és önnek kell deklarálnia őket:
<Project>
...
<Page Include="MarkupAndCodeBehindWindow.xaml" />
<Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
...
</Project>
A WPF-alkalmazások létrehozásával kapcsolatos információkért lásd: WPF-alkalmazás fordítása.
Az ablak élettartama
Mint minden osztálynál, egy ablaknak is van egy élettartama, amely az első példányosításkor kezdődik, majd megnyílik, aktiválódik/inaktiválódik, és végül bezárul.
Ablak megnyitása
Egy ablak megnyitásához először létre kell hoznia egy példányt, amelyet a következő példában mutatunk be:
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
Ebben a példában Window1
létrejön az alkalmazás indításakor, ami akkor történik, amikor a Startup esemény bekövetkezik. További információ az indítási ablakról: A fő alkalmazásablak lekérése vagy beállítása.
Amikor egy ablakot példányosítanak, automatikusan hozzáadódik a hivatkozása az
Az ablak végül úgy nyílik meg, hogy meghívja a Show metódust az alábbi képen látható módon:
A Show hívásával megnyitott ablak egy mód nélküli ablak, és az alkalmazás nem akadályozza meg a felhasználókat abban, hogy más ablakokkal kommunikáljon az alkalmazásban. Amikor egy ablakot megnyit a(z) ShowDialog paranccsal, az modális-ként nyílik meg, és az adott ablakra korlátozza a felhasználói interakciót. További információ: párbeszédpanelek áttekintése.
Amikor a Show meghívásra kerül, az ablak végrehajtja az inicializációs feladatokat, mielőtt megjelenne, hogy létrehozza azt az infrastruktúrát, amely lehetővé teszi a felhasználói bemenet fogadását. Az ablak inicializálásakor a SourceInitialized esemény megjelenik, és megjelenik az ablak.
További információ: Ablak vagy párbeszédpanel megnyitása.
Indítási ablak
Az előző példa a Startup
eseményt használta a kezdeti alkalmazásablakot megjelenítő kód futtatásához. Parancsikonként használja inkább a StartupUri-t az XAML-fájl elérési útjának meghatározásához az alkalmazásában. Az alkalmazás automatikusan létrehozza és megjeleníti az adott tulajdonság által megadott ablakot.
<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>
Az ablak tulajdonosi jogai
A Show metódussal megnyitott ablaknak nincs implicit kapcsolata az azt létrehozó ablakkal. A felhasználók a másiktól függetlenül használhatják bármelyik ablakot, ami azt jelenti, hogy bármelyik ablak a következőket teheti:
- Fedje le a másikat (kivéve, ha az egyik ablak Topmost tulajdonsága
true
). - Legyen minimalizálva, maximalizálva és visszaállítva anélkül, hogy ez hatással lenne a másikra.
Egyes ablakokhoz kapcsolatot kell létesíteni a megnyíló ablakkal. Egy integrált fejlesztési környezet (IDE) alkalmazás például megnyithat olyan tulajdonságablakokat és eszközablakokat, amelyek jellemző viselkedése az őket létrehozó ablak lefedése. Ezenkívül az ilyen ablakoknak mindig be kell záródniuk, minimalizálódniuk, maximalizálódniuk és visszaállniuk azokat létrehozó ablakkal együtt. Ez a kapcsolat úgy hozható létre, hogy az egyik ablak saját egy másikat, és a tulajdonában lévő ablak Owner tulajdonságának beállításával tulajdonosi ablakra. Ez az alábbi példában látható.
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
A tulajdonjog létrejötte után:
- A birtokolt ablak a tulajdonosi ablakra hivatkozhat a Owner nevű tulajdonság értékének megvizsgálásával.
- A tulajdonos ablak az összes saját ablakát feltérképezheti a OwnedWindows tulajdonság értékének vizsgálatával.
Ablak aktiválása
Amikor először megnyílik egy ablak, az lesz az aktív ablak. Az aktív ablak az az ablak, amely jelenleg rögzíti a felhasználói bemenetet, például a billentyűvonásokat és az egérkattintásokat. Amikor egy ablak aktívvá válik, az Activated eseményt hoz létre.
Jegyzet
Az ablak első megnyitásakor a Loaded és ContentRendered események csak a Activated esemény felemelése után lesznek előállítva. ** Ezt szem előtt tartva egy ablak hatékonyan nyitottnak tekinthető, amikor a ContentRendered emelkedik.
Miután egy ablak aktívvá válik, a felhasználó aktiválhat egy másik ablakot ugyanabban az alkalmazásban, vagy aktiválhat egy másik alkalmazást. Ha ez történik, az aktuálisan aktív ablak inaktiválódik, és elindítja a Deactivated eseményt. Hasonlóképpen, amikor a felhasználó kiválaszt egy jelenleg inaktivált ablakot, az ablak ismét aktívvá válik, és Activated létrejön.
A Activated és Deactivated kezelésének egyik gyakori oka az olyan funkciók engedélyezése és letiltása, amelyek csak akkor futnak, ha egy ablak aktív. Egyes ablakok például interaktív tartalmakat jelenítenek meg, amelyek folyamatos felhasználói bevitelt vagy figyelmet igényelnek, beleértve a játékokat és a videojátékosokat is. Az alábbi példa egy egyszerűsített videolejátszó, amely bemutatja, hogyan kezelhetők a Activated és Deactivated ennek a viselkedésnek a megvalósítása érdekében.
<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 következő kód az XAML mögötti kód.
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
Más típusú alkalmazások továbbra is futtathatnak kódot a háttérben egy ablak inaktiválásakor. Előfordulhat például, hogy egy levelezőügyfél továbbra is lekérdezi a levelezési kiszolgálót, miközben a felhasználó más alkalmazásokat használ. Az ilyen alkalmazások gyakran eltérő vagy extra viselkedést biztosítanak a főablak inaktiválása közben. Egy levelezőprogram esetében ez azt jelentheti, hogy az új e-mail elemet hozzáadja a beérkezett üzenetek mappához, és egy értesítés ikont ad hozzá a tálcához. Az értesítési ikont csak akkor kell megjeleníteni, ha az e-mail ablak nem aktív, amelyet a IsActive tulajdonság vizsgálata határoz meg.
Ha egy háttérfeladat befejeződik, előfordulhat, hogy egy ablak sürgősebben szeretné értesíteni a felhasználót Activate metódus meghívásával. Ha a felhasználó egy másik, Activate hívásakor aktivált alkalmazással kommunikál, az ablak tálcájának gombja villog. Ha azonban egy felhasználó az aktuális alkalmazással kommunikál, a Activate hívásával előtérbe kerül az ablak.
Jegyzet
Az alkalmazás hatókörének aktiválását a Application.Activated és Application.Deactivated események használatával kezelheti.
Ablak aktiválásának megakadályozása
Vannak olyan helyzetek, amikor a windowsokat nem kell aktiválni, amikor megjelenik, például egy csevegőalkalmazás beszélgetési ablakai vagy egy e-mail-alkalmazás értesítési ablakai.
Ha az alkalmazás olyan ablakkal rendelkezik, amelyet nem kell aktiválni, amikor megjelenik, a ShowActivated tulajdonságát false
értékre állíthatja, mielőtt első alkalommal meghívja a Show metódust. Ennek következtében:
- Az ablak nincs aktiválva.
- Az ablak Activated esemény nem lett aktiválva.
- Az aktuálisan aktivált ablak továbbra is aktiválva marad.
Az ablak azonban azonnal aktiválódik, amint a felhasználó aktiválja azt az ügyfélre vagy nem ügyfélterületre kattintva. Ebben az esetben:
- Az ablak aktiválva van.
- Az ablak Activated eseménye kiváltódik.
- A korábban aktivált ablak inaktiválva van.
- Az ablak Deactivated és Activated eseményei a felhasználói műveletekre adott válaszként a várt módon jelennek meg.
Ablak bezárása
Az ablak élettartama akkor ér véget, amikor egy felhasználó bezárja. Miután bezárt egy ablakot, nem nyitható meg újra. Az ablakokat a nem ügyfélterület elemeivel lehet bezárni, beleértve a következőket:
- A System menü bezárása elem.
- Nyomja le ALT + F4billentyűkombinációt.
- Nyomja meg a Bezárás gombot.
- Ha egy gomb IsCancel tulajdonsága
true
egy modális ablakban, akkor nyomja meg a ESC billentyűket.
Az ablak bezárásához több mechanizmust is megadhat az ügyfélterületen, amelyek közül a leggyakoribbak a következők:
- Egy Kilépés elem a Fájl menüből, jellemzően a fő alkalmazásablakokhoz.
- Egy Zárja be elemet a Fájl menüben, általában egy másodlagos alkalmazásablakban.
- A Mégse gomb, általában egy modális párbeszédpanelen.
- A Bezárás gomb, általában egy modalitás nélküli párbeszédpanelen.
Ha be szeretne zárni egy ablakot ezen egyéni mechanizmusok egyikére válaszul, meg kell hívnia a Close metódust. Az alábbi példa egy ablak bezárásának lehetőségét valósítja meg, ha a Fájl menüből Kilépés lehetőséget választja.
<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 következő kód az XAML mögötti kód.
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
Jegyzet
Az alkalmazások úgy konfigurálhatók, hogy automatikusan leálljanak, amikor a fő alkalmazásablak bezárul (lásd MainWindow) vagy az utolsó ablak bezárul. További információ: ShutdownMode.
Bár az ablak explicit módon bezárható a nem ügyfél- és ügyfélterületeken biztosított mechanizmusokkal, az ablak implicit módon is bezárható az alkalmazás vagy a Windows más részeinek viselkedése miatt, beleértve a következőket is:
- A felhasználó kijelentkezik vagy leállítja a Windowst.
- Egy Owner jelű ablak bezárul.
- A fő alkalmazásablak be van zárva, és ShutdownModeOnMainWindowClose.
- Így nevezik: Shutdown.
Fontos
Az ablak bezárása után nem nyitható meg újra.
Ablak bezárásának megszakítása
Amikor egy ablak bezárul, két eseményt hoz létre: Closing és Closed.
Closing az ablak bezárása előtt emelik ki, és olyan mechanizmust biztosít, amellyel megelőzhető az ablakbezárás. Az ablak bezárásának egyik gyakori oka az, ha az ablak tartalma módosított adatokat tartalmaz. Ebben az esetben a Closing esemény kezelhető annak megállapításához, hogy az adatok piszkosak-e, és ha igen, megkérdezheti a felhasználót, hogy folytatja-e az ablak bezárását az adatok mentése nélkül, vagy megszakítja az ablak bezárását. Az alábbi példa a Closingkezelésének főbb szempontjait mutatja be.
<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 következő kód az XAML mögötti kód.
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
A Closing eseménykezelőnek átadnak egy CancelEventArgs-et, amely megvalósítja a Cancel tulajdonságot, amelyet beállítasz true
-re, hogy megakadályozd az ablak bezárását.
Ha a Closing-t nem kezelik, vagy ha kezeled, de nem törlöd, az ablak be fog záródni. Mielőtt egy ablak ténylegesen bezárul, Closed fel lesz emelve. Ezen a ponton az ablak nem zárható be.
Ablak élettartamának eseményei
Az alábbi ábrán a fő események sorozata látható egy ablak élettartama alatt:
Az alábbi ábrán az aktiválás nélkül megjelenő ablak fő eseményeinek sorrendje látható (ShowActivated az ablak megjelenítése előtt false
van beállítva):
Ablak helye
Amíg egy ablak nyitva van, az asztalhoz viszonyított x és y koordinátákban van helye. Ezt a helyet a Left és a Top tulajdonságainak vizsgálatával lehet meghatározni. Állítsa be ezeket a tulajdonságokat az ablak helyének módosításához.
A Window kezdeti helyét is megadhatja, ha a WindowStartupLocation tulajdonságot az alábbi WindowStartupLocation enumerálási értékek egyikével állítja be:
- CenterOwner (alapértelmezett)
- CenterScreen
- Manual
Ha az indítási helyet Manual-ként adják meg, és a Left és Top tulajdonságok nincsenek beállítva, akkor Window megkéri az operációs rendszert, hogy találjon egy helyet megjelenéshez.
Legfelső ablakok és a z-sorrend
Az x és az y hely mellett egy ablaknak is van helye a z dimenzióban, amely meghatározza a függőleges pozícióját a többi ablakhoz képest. Ez az ablak z-sorrendje, és két típus létezik: normál z-order és legfelső z-order. Egy ablak helye a normál z-order-ben attól függ, hogy jelenleg aktív-e vagy sem. Alapértelmezés szerint egy ablak a normál z-sorrendben található. Az ablak helyzetét a legfelső z-sorrend is befolyásolja, attól függően, hogy jelenleg aktív-e vagy sem. Ezenkívül a legfelső z-sorrendben lévő ablakok mindig a normál z-sorrendben találhatók az ablakok felett. Az ablak a legfelső z-sorrendben található úgy, hogy Topmost tulajdonságát true
értékre állítja.
Az egyes z-rendeléstípusokon belül az aktuálisan aktív ablak az összes többi ablak felett jelenik meg ugyanabban a z-sorrendben.
Ablak mérete
Amellett, hogy az ablaknak van egy helyzete az asztali környezetben, méretét több tulajdonság határozza meg, beleértve a szélesség és magasság különböző tulajdonságait, valamint SizeToContent-at.
MinWidth, Widthés MaxWidth az ablak szélességi tartományának kezelésére szolgál az ablak élettartama során.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
MinWidth="300" Width="400" MaxWidth="500">
</Window>
Az ablakmagasságot MinHeight, Heightés MaxHeightkezeli.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
MinHeight="300" Height="400" MaxHeight="500">
</Window>
Mivel a különböző szélességi értékek és magasságértékek mindegyike egy tartományt határoz meg, lehetséges, hogy az átméretezhető ablak szélessége és magassága a megadott tartományon belülre esik az adott dimenzióhoz. Az aktuális szélesség és magasság meghatározásához vizsgálja meg a ActualWidth-et és a ActualHeight-et.
Ha azt szeretné, hogy az ablak szélessége és magassága olyan méretű legyen, amely megfelel az ablak tartalmának, használhatja a SizeToContent tulajdonságot, amely a következő értékeket tartalmazza:
-
SizeToContent.Manual
Nincs effektus (alapértelmezett). -
MéretTartalom.Szélesség
Illeszkedik a tartalom szélességéhez, amelynek hatása megegyezik a MinWidth és a MaxWidth a tartalom szélességének beállításával. -
SizeToContent.Magasság
Illeszkedik a tartalom magasságához, amely ugyanolyan hatással van, mint a MinHeight és a MaxHeight beállítása a tartalom magasságára. -
SizeToContent.WidthAndHeight
Illeszkedik a tartalom szélességéhez és magasságához, amely ugyanolyan hatással van, mint a MinHeight és a MaxHeight beállítása a tartalom magasságára, valamint a MinWidth és MaxWidth beállítása a tartalom szélességére.
Az alábbi példa egy olyan ablakot mutat be, amely automatikusan méretez, hogy függőlegesen és vízszintesen is illeszkedjen a tartalmához, amikor először megjelenik.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
SizeToContent="WidthAndHeight">
</Window>
Az alábbi példa bemutatja, hogyan állíthatja be a SizeToContent tulajdonságot a kódban annak meghatározásához, hogy az ablak hogyan méretezhető át a tartalmához.
// 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
A méretezési tulajdonságok rangsora
Az ablakok különböző mérettulajdonságai lényegében kombinálva határozzák meg az átméretezhető ablakok szélességi és magassági tartományát. Az érvényes tartomány fenntartása érdekében Window a mérettulajdonságok értékeit az alábbi sorrendben értékeli ki.
Magassági tulajdonságok:
- FrameworkElement.MinHeight
- FrameworkElement.MaxHeight
- SizeToContent.Height / SizeToContent.WidthAndHeight
- FrameworkElement.Height
Szélességi Tulajdonságok:
- FrameworkElement.MinWidth
- FrameworkElement.MaxWidth
- SizeToContent.Width / SizeToContent.WidthAndHeight
- FrameworkElement.Width
Az elsőbbségi sorrend meghatározhatja az ablak méretét is, amikor nagyítva van, amelyet a WindowState tulajdonság kezel.
Ablak állapota
Az átméretezhető ablak élettartama alatt három állapotot vehet fel: normál, minimalizált és maximalizált. Az ablak alapértelmezett állapota egy normál állapotú ablak. Az ilyen állapotú ablakok lehetővé teszik, hogy a felhasználó átméretező fogó vagy szegély használatával áthelyezhesse és átméretezhesse azt, ha átméretezhető.
Egy kis méretű ablak, állapota összecsukódik a tálca gombjára, ha ShowInTaskbartrue
; ellenkező esetben a lehető legkisebb méretre csukódik össze, és az asztal bal alsó sarkába kerül. Egyik típusú minimalizált ablak sem méretezhető át szegéllyel vagy átméretezési fogással, bár a tálcán nem látható minimalizált ablak az asztalon húzható.
Olyan ablak, amely teljes állapotban van, a lehető legnagyobb méretre bővül, amennyire a MaxWidth, MaxHeightés SizeToContent tulajdonságai megengedik. A kisméretű ablakokhoz hasonlóan a teljes méretű ablakokat sem átméretezheti átméretezési fogókkal, sem a szegély húzásával.
Jegyzet
Az ablak Top, Left, Widthés Height tulajdonságai mindig a normál állapot értékeit képviselik, még akkor is, ha az ablak jelenleg nagy méretű vagy kis méretű.
Az ablak állapota a WindowState tulajdonság beállításával konfigurálható, amely az alábbi WindowState enumerálási értékek egyikével rendelkezhet:
Az alábbi példa bemutatja, hogyan hozhat létre olyan ablakot, amely a megnyitáskor teljes méretben jelenik meg.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowState="Maximized">
</Window>
Általában WindowState kell beállítania az ablak kezdeti állapotának konfigurálásához. Ha megjelenik egy átméretezhető ablak, a felhasználók az ablak címsorában a kis méret, a teljes méret és a visszaállítás gombjait lenyomva módosíthatják az ablak állapotát.
Ablak megjelenése
Az ablak ügyfélterületének megjelenését úgy módosíthatja, hogy ablakspecifikus tartalmat ad hozzá, például gombokat, címkéket és szövegdobozokat. A nem ügyfélterület konfigurálásához Window számos tulajdonságot biztosít, például Icon az ablak ikonjának beállításához, és Title a cím beállításához.
A nem ügyfélterület szegélyének megjelenését és viselkedését úgy is módosíthatja, hogy konfigurálja az ablak átméretezési módját, az ablakstílust, valamint azt, hogy gombként jelenik-e meg az asztali tálcán.
Az átméretezés módja
A WindowStyle tulajdonságtól függően szabályozhatja, hogy a felhasználók átméretezik-e az ablakot. Az ablakstílus a következőket befolyásolja:
- Az egérrel az ablakszegély húzásával engedélyezheti vagy tilthatja le az átméretezést.
- Megjelenik-e a Kicsinyítés, Maximalizálásés Bezárás gomb a nem ügyfél területen.
- Engedélyezve van-e a Kis méretezés, Teljes méretezésés Bezárás gomb.
Az ablak átméretezésének módját a ResizeMode tulajdonság beállításával konfigurálhatja, amely az alábbi ResizeMode enumerálási értékek egyike lehet:
- NoResize
- CanMinimize
- CanResize (alapértelmezett)
- CanResizeWithGrip
A WindowStyle-hez hasonlóan az ablak átméretezési módja valószínűleg nem változik az élettartama során, ami azt jelenti, hogy valószínűleg XAML-jelöléssel állítja be.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ResizeMode="CanResizeWithGrip">
</Window>
Vegye figyelembe, hogy a WindowState tulajdonság vizsgálatával észlelheti, hogy egy ablak teljes méretű, kis méretű vagy visszaállítva van-e.
Ablakstílus
Az ablak nem ügyfélterületéről elérhető szegély a legtöbb alkalmazás számára megfelelő. Vannak azonban olyan körülmények, amikor különböző típusú szegélyekre van szükség, vagy egyáltalán nincs szükség szegélyre az ablak típusától függően.
Annak szabályozásához, hogy az ablak milyen típusú szegélyt kap, a WindowStyle tulajdonságát a WindowStyle enumerálás alábbi értékeinek egyikével állíthatja be:
- None
- SingleBorderWindow (alapértelmezett)
- ThreeDBorderWindow
- ToolWindow
Az ablakstílusok alkalmazásának hatását az alábbi képen szemlélteti:
Figyelje meg, hogy a fenti kép nem mutat észrevehető különbséget SingleBorderWindow
és ThreeDBorderWindow
között. A Windows XP-ben ThreeDBorderWindow
hatással volt az ablak rajzolására, és 3D szegélyt adott hozzá az ügyfélterülethez. A Windows 7-től kezdve a két stílus közötti különbségek minimálisak.
A WindowStyle XAML jelöléssel vagy kóddal állítható be. Mivel az ablak élettartama alatt valószínűtlen, hogy megváltozna, nagy valószínűséggel XAML jelölés segítségével fogja konfigurálni.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowStyle="ToolWindow">
</Window>
Nem téglalap alakú ablakstílus
Vannak olyan helyzetek is, amikor az WindowStyle szegélystílusok nem elegendőek. Előfordulhat például, hogy nem téglalap alakú szegélyű alkalmazást szeretne létrehozni, ahogyan a Microsoft Windows Media Player használja.
Vegyük például az alábbi képen látható beszédbuborék-ablakot:
Ez az ablaktípus úgy hozható létre, hogy a WindowStyle tulajdonságot Noneértékre állítja, és a Window által biztosított speciális támogatással biztosítja az átláthatóságot.
<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>
Ez az értékkombináció arra utasítja az ablakot, hogy transzparens legyen. Ebben az állapotban az ablak nem ügyfélterület-ékesítési gombjai nem használhatók, és önnek kell megadnia a sajátját.
Tevékenységsáv jelenléte
Az ablak alapértelmezett megjelenése tartalmaz egy tálcagombot. Bizonyos típusú ablakoknak nincs tálcagombjuk, például üzenetpanelek, párbeszédpanelek, vagy olyan ablakok, amelyek WindowStyle tulajdonsága ToolWindow. A ShowInTaskbar tulajdonság alapértelmezés szerint true
beállításával szabályozhatja, hogy megjelenik-e egy ablak tálcájának gombja.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ShowInTaskbar="False">
</Window>
Egyéb típusú ablakok
NavigationWindow egy olyan ablak, amely navigálásra alkalmas tartalmak tárolására szolgál.
A párbeszédpanelek olyan ablakok, amelyeket gyakran használnak a felhasználótól a függvények elvégzéséhez szükséges információk gyűjtésére. Ha például egy felhasználó meg szeretne nyitni egy fájlt, az alkalmazás megjeleníti a Fájl megnyitása párbeszédpanelt, hogy lekérje a fájl nevét a felhasználótól. További információ: párbeszédpanelek áttekintése.
Lásd még:
.NET Desktop feedback