Megosztás a következőn keresztül:


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:

WPF-ablak részeit bemutató képernyőkép.

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 a x:Class attribútumot. Az alkalmazás létrehozásakor a x:Class attribútum megléte miatt a Microsoft buildmotorja (MSBuild) létrehoz egy partial osztályt, amely a x: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étrehozott partial osztály implementálja a InitializeComponent 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és x: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étrehozott partial 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étrehozott partial 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 objektum által felügyelt ablakok listájához. A példányosítandó első ablakot automatikusan Application állítja be a fő alkalmazásablakként.

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:

WPF-ablak, amely egyetlen gombot tartalmaz

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:

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:

diagram, amely egy ablak élettartamának eseményeit jeleníti meg.

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):

diagram, amely egy ablak élettartamának eseményeit jeleníti meg aktiválás nélkül.

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:

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:

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:

  1. FrameworkElement.MinHeight
  2. FrameworkElement.MaxHeight
  3. SizeToContent.Height / SizeToContent.WidthAndHeight
  4. FrameworkElement.Height

Szélességi Tulajdonságok:

  1. FrameworkElement.MinWidth
  2. FrameworkElement.MaxWidth
  3. SizeToContent.Width / SizeToContent.WidthAndHeight
  4. 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:

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:

Az ablakstílusok alkalmazásának hatását az alábbi képen szemlélteti:

Képernyőkép, amely bemutatja, hogyan befolyásolja a WindowStyle a WPF ablakát.

Figyelje meg, hogy a fenti kép nem mutat észrevehető különbséget SingleBorderWindow és ThreeDBorderWindowkö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:

Levágott területtel és egyéni alakzatokkal rendelkező WPF-ablak képernyőképe.

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: