Párbeszédpanelek áttekintése

A Windows Presentation Foundation (WPF) lehetővé teszi saját párbeszédpanelek tervezését. A párbeszédpanelek ablakok, de meghatározott szándékkal és felhasználói felülettel rendelkeznek. Ez a cikk bemutatja, hogyan működik egy párbeszédpanel, és milyen típusú párbeszédpaneleket hozhat létre és használhat. A párbeszédpanelek a következőkre használhatók:

  • Adott információk megjelenítése a felhasználók számára.
  • Információk gyűjtése a felhasználóktól.
  • Az információt mind megjelenítik, mind gyűjtik.
  • Megjeleníthet egy operációsrendszer-parancssort, például a nyomtatási ablakot.
  • Válasszon ki egy fájlt vagy mappát.

Az ilyen típusú ablakokat párbeszédpaneleknek nevezzük. A párbeszédpanel kétféleképpen jeleníthető meg: modális és nem modális.

Egy modális párbeszédpanel megjelenítése a felhasználó számára egy olyan technika, amellyel az alkalmazás megszakítja a műveletét, amíg a felhasználó be nem zárja a párbeszédpanelt. Ez általában parancssor vagy riasztás formájában jelenik meg. Az alkalmazás többi ablaka csak akkor használható, ha bezárja a párbeszédpanelt. Miután bezárta a modális párbeszédpanelt, az alkalmazás folytatódik. A leggyakoribb párbeszédpanelek egy megnyitott fájl megjelenítésére vagy fájl mentésére, a nyomtató párbeszédpanel megjelenítésére vagy a felhasználó valamilyen állapotú üzenetküldésére szolgálnak.

A modell nélküli párbeszédpanel nem akadályozza meg, hogy a felhasználó más ablakokat aktiváljon, amíg nyitva van. Ha például egy felhasználó egy adott szó előfordulásait szeretné megtalálni egy dokumentumban, a főablak gyakran megnyit egy párbeszédpanelt, hogy megkérdezze a felhasználótól, hogy milyen szót keres. Mivel az alkalmazás nem szeretné megakadályozni, hogy a felhasználó szerkessze a dokumentumot, a párbeszédpanelnek nem kell modálisnak lennie. Egy nem modális párbeszédpanel legalább egy Bezárás gombot biztosít a párbeszédpanel bezárásához. Más gombok is használhatók bizonyos függvények futtatásához, például egy Következő keresése gombot, hogy megkeresse a következő szót egy szókeresésben.

A WPF használatával többféle párbeszédpanelt is létrehozhat, például üzenetdobozokat, gyakori párbeszédpaneleket és egyéni párbeszédpaneleket. Ez a cikk mindegyiket ismerteti, és a párbeszédpanel minta egyező példákat tartalmaz.

Üzenetmezők

Az üzenetmező egy párbeszédpanel, amely szöveges információk megjelenítésére és a felhasználók gombokkal történő döntéshozatalára használható. Az alábbi ábrán egy olyan üzenetmező látható, amely kérdést tesz fel, és három gombot biztosít a felhasználónak a kérdés megválaszolásához.

Szövegszerkesztő párbeszédpanelen megkérdezi, hogy szeretné-e menteni a dokumentum módosításait az alkalmazás bezárása előtt.

Üzenetmező létrehozásához használja a MessageBox osztályt. MessageBox lehetővé teszi az üzenetmező szövegének, címének, ikonjának és gombjainak konfigurálását.

További információ: Üzenetmező megnyitása.

Gyakori párbeszédpanelek

A Windows különböző, az összes alkalmazásban gyakran használt, újrafelhasználható párbeszédpanelt implementál, beleértve a fájlok kiválasztására és a nyomtatásra szolgáló párbeszédpaneleket is.

Mivel ezeket a párbeszédpaneleket az operációs rendszer biztosítja, azok meg vannak osztva az operációs rendszeren futó összes alkalmazás között. Ezek a párbeszédpanelek konzisztens felhasználói élményt biztosítanak, és gyakori párbeszédpanelekként ismertek. Mivel a felhasználók egy alkalmazásban gyakran használt párbeszédpanelt használnak, nem kell megtanulniuk, hogyan használhatják ezt a párbeszédpanelt más alkalmazásokban.

A WPF beágyazza a megnyitott fájlt, menti a fájlt, megnyit egy mappát, és kinyomtatja a közös párbeszédpaneleket, és felügyelt osztályként teszi elérhetővé őket.

Egy WPF-ből hívott

A gyakori párbeszédpanelekről az alábbi cikkekben olvashat bővebben:

Egyéni párbeszédpanelek

Bár a gyakori párbeszédpanelek hasznosak, és ha lehetséges, használni kell őket, nem támogatják a tartományspecifikus párbeszédpanelek követelményeit. Ezekben az esetekben létre kell hoznia saját párbeszédpaneleket. Amint látni fogjuk, a párbeszédpanel egy speciális viselkedésű ablak. Window implementálja ezeket a viselkedéseket, és az ablakban egyéni modális és nem modális párbeszédpaneleket hozhat létre.

A saját párbeszédpanel létrehozásakor számos tervezési szempontot figyelembe kell venni. Bár az alkalmazásablak és a párbeszédpanel egyaránt tartalmaz hasonlóságokat, például ugyanazt az alaposztályt, egy párbeszédpanelt használ egy adott célra. Általában párbeszédpanelre van szükség, amikor valamilyen információt vagy választ kell kérnie a felhasználótól. Az alkalmazás általában szünetel, amíg megjelenik a párbeszédpanel (modális), korlátozva az alkalmazás többi részéhez való hozzáférést. A párbeszédpanel bezárása után az alkalmazás folytatódik. Az interakciók korlátozása csak a párbeszédpanelre azonban nem követelmény.

Ha egy WPF-ablak be van zárva, az nem nyitható meg újra. Az egyéni párbeszédpanelek WPF-ablakok, és ugyanez a szabály érvényes. Az ablak bezárásáról az Ablak vagy párbeszédpanel bezárásacímű témakörben olvashat.

Párbeszédpanel megvalósítása

Párbeszédpanel tervezésekor kövesse az alábbi javaslatokat a megfelelő felhasználói élmény létrehozásához:

❌ NE tegye zsúfolttá a párbeszédpanelt. A párbeszédpanelen a felhasználónak meg kell adnia néhány adatot, vagy választania kell.

✔️ Feltétlenül biztosítson egy OK gombot az ablak bezárásához.

✔️ ÁLLÍTSA BE az OK gomb IsDefault tulajdonságát true értékre, hogy a felhasználó az ENTER billentyűt lenyomva elfogadhassa és bezárhassa az ablakot.

Javasolt egy Mégse gomb hozzáadása, hogy a felhasználó bezárja az ablakot, és jelezze, hogy nem akarja folytatni.

✔️ A DO állítsa a Mégse gomb IsCancel tulajdonságát true, hogy a felhasználó az ablak bezárásához nyomja le a ESC billentyűt.

✔️ A DO az ablak címét úgy állítja be, hogy pontosan leírja, mit jelöl a párbeszédpanel, vagy hogy a felhasználó mit tegyen a párbeszédpanelen.

✔️ A DO állítsa be az ablak minimális szélességi és magassági értékeit, így a felhasználó nem méretezheti túl kicsire az ablakot.

✔️ Fontolja meg az ablak átméretezésének letiltását, ha ShowInTaskbarfalseértékre van állítva. Az átméretezést úgy tilthatja le, hogy a ResizeMode beállítást NoResize-re állítja.

Az alábbi kód bemutatja ezt a konfigurációt.

<Window x:Class="Dialogs.Margins"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Change Margins"
        Closing="Window_Closing"
        MinHeight="200"
        MinWidth="300"
        SizeToContent="WidthAndHeight"
        ResizeMode="NoResize"
        ShowInTaskbar="False"
        WindowStartupLocation="CenterOwner" 
        FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">
    <Grid Margin="10">
        <Grid.Resources>
            <!-- Default settings for controls -->
            <Style TargetType="{x:Type Label}">
                <Setter Property="Margin" Value="0,3,5,5" />
                <Setter Property="Padding" Value="0,0,0,5" />
            </Style>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="Margin" Value="0,0,0,5" />
            </Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Width" Value="70" />
                <Setter Property="Height" Value="25" />
                <Setter Property="Margin" Value="5,0,0,0" />
            </Style>
        </Grid.Resources>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <!-- Left,Top,Right,Bottom margins-->
        <Label Grid.Column="0" Grid.Row="0">Left Margin:</Label>
        <TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0" />

        <Label Grid.Column="0" Grid.Row="1">Top Margin:</Label>
        <TextBox Name="topMarginTextBox" Grid.Column="1" Grid.Row="1"/>

        <Label Grid.Column="0" Grid.Row="2">Right Margin:</Label>
        <TextBox Name="rightMarginTextBox" Grid.Column="1" Grid.Row="2" />

        <Label Grid.Column="0" Grid.Row="3">Bottom Margin:</Label>
        <TextBox Name="bottomMarginTextBox" Grid.Column="1" Grid.Row="3" />

        <!-- Accept or Cancel -->
        <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Name="okButton" Click="okButton_Click" IsDefault="True">OK</Button>
            <Button Name="cancelButton" IsCancel="True">Cancel</Button>
        </StackPanel>
    </Grid >
</Window>

A fenti XAML az alábbi képhez hasonló ablakot hoz létre:

A WPF párbeszédpanelablaka, amely bal, felső, jobb és alsó szövegmezőt jelenít meg.

Párbeszédpanelt megnyitó felhasználói felületi elemek

A párbeszédpanel felhasználói felülete a menüsávra vagy a megnyíló ablak gombjára is kiterjed. Ha egy menüelem vagy gomb olyan függvényt futtat, amely felhasználói interakciót igényel egy párbeszédpanelen, mielőtt a függvény folytatódhat, a vezérlőnek a szöveg végén három pontot kell használnia:

<MenuItem Header="_Margins..." Click="formatMarginsMenuItem_Click" />
<!-- or -->
<Button Content="_Margins..." Click="formatMarginsButton_Click" />

Ha egy menüelem vagy gomb olyan függvényt futtat, amely olyan párbeszédpanelt jelenít meg, amely nem felhasználói beavatkozást igényel, például Névjegy párbeszédpanelen, nincs szükség három pontra.

A menüelemek gyakran biztosítják a felhasználók számára a kapcsolódó témákba csoportosított alkalmazásműveleteket. Valószínűleg számos különböző alkalmazásban látta a Fájl menüt. Egy tipikus alkalmazásban a Fájl menüelem lehetővé teszi a fájlok mentését, betöltését és nyomtatását. Ha a művelet modális ablakot jelenít meg, a fejléc általában pontokat tartalmaz, ahogyan az a következő képen látható.

WPF-ablak, amely három ponttal jeleníti meg a menüelemeket, hogy jelezze, melyik elem jelenik meg egy párbeszédpanelen.

Két menüelem mögött három pont van: .... Ez segít a felhasználónak azonosítani, hogy amikor kiválasztja ezeket a menüelemeket, megjelenik egy modális ablak, amely addig szünetelteti az alkalmazást, amíg a felhasználó be nem zárja.

Ezzel a tervezési technikával egyszerűen kommunikálhat a felhasználókkal, hogy mit várnak el.

Gombok

A menüelemek szakaszban ismertetett elvet követheti. A gomb szövegében használjon három pontot annak jelzésére, hogy a felhasználó a gomb lenyomásakor egy modális párbeszédpanel jelenik meg. Az alábbi képen két gomb látható, és könnyen érthető, hogy melyik gomb jelenik meg egy párbeszédpanelen:

EGY WPF-ablakot, amely három pontot tartalmazó gombokat jelenít meg, amelyek jelzik, hogy melyik elem jelenik meg egy párbeszédpanelen.

Eredmény visszaadása

Egy másik ablak, különösen egy modális párbeszédpanel megnyitása nagyszerű módja annak, hogy állapotot és információt adjon vissza a hívó kódnak.

Ha egy párbeszédpanel ShowDialog()meghívásával jelenik meg, a párbeszédpanelt megnyitó kód megvárja, amíg a ShowDialog metódus visszatér. Amikor a metódus visszatér, az azt nevező kódnak el kell döntenie, hogy folytatja-e a feldolgozást, vagy leállítja a feldolgozást. A felhasználó ezt általában egy OK vagy Mégse gomb megnyomásával jelzi a párbeszédpanelen.

Amikor az OK gombot lenyomják, a ShowDialog-t úgy kell megtervezni, hogy visszatérjen true-ra, és a Mégse gomb visszatérjen false-ra. Ez a gomb megnyomásakor a DialogResult tulajdonság beállításával érhető el.

private void okButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = true;

private void cancelButton_Click(object sender, RoutedEventArgs e) =>
    DialogResult = false;
Private Sub okButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = True
End Sub

Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
    DialogResult = False
End Sub

A DialogResult tulajdonság csak akkor állítható be, ha a párbeszédpanel ShowDialog()meg lett jelenítve. Ha a DialogResult tulajdonság be van állítva, a párbeszédpanel bezárul.

Ha egy gomb IsCancel tulajdonsága trueértékre van állítva, és az ablak ShowDialog()van megnyitva, a ESC billentyű bezárja az ablakot, és beállítja DialogResult-t false-ra.

További információ a párbeszédpanelek bezárásáról: Ablak vagy párbeszédpanel bezárása.

A válasz feldolgozása

A ShowDialog() logikai értéket ad vissza, amely jelzi, hogy a felhasználó elfogadta vagy megszakította-e a párbeszédpanelt. Ha riasztást küld a felhasználónak valamiről, de nem követeli meg a döntés meghozatalát vagy az adatok megadását, figyelmen kívül hagyhatja a választ. A válasz a DialogResult tulajdonság ellenőrzésével is megvizsgálható. A következő kód bemutatja, hogyan lehet feldolgozni a választ:

var dialog = new Margins();

// Display the dialog box and read the response
bool? result = dialog.ShowDialog();

if (result == true)
{
    // User accepted the dialog box
    MessageBox.Show("Your request will be processed.");
}
else
{
    // User cancelled the dialog box
    MessageBox.Show("Sorry it didn't work out, we'll try again later.");
}
Dim marginsWindow As New Margins

Dim result As Boolean? = marginsWindow.ShowDialog()

If result = True Then
    ' User accepted the dialog box
    MessageBox.Show("Your request will be processed.")
Else
    ' User cancelled the dialog box
    MessageBox.Show("Sorry it didn't work out, we'll try again later.")
End If

marginsWindow.Show()

Mód nélküli párbeszédpanel

A párbeszédpanel modellesség megjelenítéséhez hívja meg Show(). A párbeszédpanelen legalább egy Bezárás gombot kell megadnia. Más gombokat és interaktív elemeket is megadhat egy adott függvény futtatásához, például egy Következő keresése gombot, hogy megkeresse a következő szót egy szókeresésben.

Mivel egy modeless párbeszédpanel nem akadályozza meg a hívó kód folytatását, más módot kell találni az eredmény visszaadására. Az alábbiak egyikét teheti meg:

  • Adatobjektum-tulajdonság felfedése az ablakban.
  • Kezelje a Window.Closed eseményt a hívókódban.
  • Hozzon létre eseményeket az ablakban, amelyek akkor jelennek meg, amikor a felhasználó kijelöl egy objektumot, vagy lenyom egy adott gombot.

Az alábbi példa a Window.Closed esemény használatával jelenít meg egy üzenetmezőt a felhasználónak a párbeszédpanel bezárásakor. A megjelenített üzenet a bezárt párbeszédpanel egyik tulajdonságára hivatkozik. További információ a párbeszédpanelek bezárásáról: Ablak vagy párbeszédpanel bezárása.

var marginsWindow = new Margins();

marginsWindow.Closed += (sender, eventArgs) =>
{
    MessageBox.Show($"You closed the margins window! It had the title of {marginsWindow.Title}");
};

marginsWindow.Show();
Dim marginsWindow As New Margins

AddHandler marginsWindow.Closed, Sub(sender As Object, e As EventArgs)
                                     MessageBox.Show($"You closed the margins window! It had the title of {marginsWindow.Title}")
                                 End Sub

marginsWindow.Show()

Lásd még