Bagikan melalui


Gambaran Umum kotak dialog

Aplikasi mandiri biasanya memiliki jendela utama yang menampilkan data utama tempat aplikasi beroperasi dan mengekspos fungsionalitas untuk memproses data tersebut melalui mekanisme antarmuka pengguna (UI) seperti bilah menu, bilah alat, dan bilah status. Aplikasi non-sepele juga dapat menampilkan jendela tambahan untuk melakukan hal berikut:

  • Tampilkan informasi spesifik kepada pengguna.

  • Mengumpulkan informasi dari pengguna.

  • Tampilkan dan kumpulkan informasi.

Jenis jendela ini dikenal sebagai kotak dialog, dan ada dua jenis: modal dan modeless.

Kotak dialog modal ditampilkan oleh fungsi saat fungsi membutuhkan data tambahan dari pengguna untuk melanjutkan. Karena fungsi tergantung pada kotak dialog modal untuk mengumpulkan data, kotak dialog modal juga mencegah pengguna mengaktifkan jendela lain dalam aplikasi saat tetap terbuka. Dalam kebanyakan kasus, kotak dialog modal memungkinkan pengguna untuk memberi sinyal ketika mereka telah selesai dengan kotak dialog modal dengan menekan tombol OK atau Batal . Menekan tombol OK menunjukkan bahwa pengguna telah memasukkan data dan ingin fungsi terus memproses dengan data tersebut. Menekan tombol Batal menunjukkan bahwa pengguna ingin menghentikan fungsi agar tidak dijalankan sama sekali. Contoh kotak dialog modal yang paling umum diperlihatkan untuk membuka, menyimpan, dan mencetak data.

Kotak dialog tanpa mode, di sisi lain, tidak mencegah pengguna mengaktifkan jendela lain saat terbuka. Misalnya, jika pengguna ingin menemukan kemunculan kata tertentu dalam dokumen, jendela utama akan sering membuka kotak dialog untuk bertanya kepada pengguna kata apa yang mereka cari. Karena menemukan kata tidak mencegah pengguna mengedit dokumen, namun, kotak dialog tidak perlu dimodifikasi. Kotak dialog tanpa mode setidaknya menyediakan tombol Tutup untuk menutup kotak dialog, dan mungkin menyediakan tombol tambahan untuk menjalankan fungsi tertentu, seperti tombol Temukan Berikutnya untuk menemukan kata berikutnya yang cocok dengan kriteria pencarian kata.

Windows Presentation Foundation (WPF) memungkinkan Anda membuat beberapa tipe kotak dialog, termasuk kotak pesan, kotak dialog umum, dan kotak dialog kustom. Topik ini membahas masing-masing, dan Sampel Kotak Dialog menyediakan contoh yang cocok.

Kotak pesan

Kotak pesan adalah kotak dialog yang dapat digunakan untuk menampilkan informasi tekstual dan untuk memungkinkan pengguna membuat keputusan dengan tombol. Gambar berikut menunjukkan kotak pesan yang menampilkan informasi tekstual, mengajukan pertanyaan, dan memberi pengguna tiga tombol untuk menjawab pertanyaan.

A Word Processor dialog box asking if you want to save the changes to the document before the application closes.

Untuk membuat kotak pesan, Anda menggunakan MessageBox kelas . MessageBox memungkinkan Anda mengonfigurasi teks kotak pesan, judul, ikon, dan tombol, menggunakan kode seperti berikut ini.

// Configure the message box to be displayed
string messageBoxText = "Do you want to save changes?";
string caption = "Word Processor";
MessageBoxButton button = MessageBoxButton.YesNoCancel;
MessageBoxImage icon = MessageBoxImage.Warning;
' Configure the message box to be displayed
Dim messageBoxText As String = "Do you want to save changes?"
Dim caption As String = "Word Processor"
Dim button As MessageBoxButton = MessageBoxButton.YesNoCancel
Dim icon As MessageBoxImage = MessageBoxImage.Warning

Untuk memperlihatkan kotak pesan, Anda memanggil metode , seperti yang staticShow ditunjukkan dalam kode berikut.

// Display message box
MessageBox.Show(messageBoxText, caption, button, icon);
' Display message box
MessageBox.Show(messageBoxText, caption, button, icon)

Saat kode yang memperlihatkan kotak pesan perlu mendeteksi dan memproses keputusan pengguna (tombol mana yang ditekan), kode dapat memeriksa hasil kotak pesan, seperti yang ditunjukkan dalam kode berikut.

// Display message box
MessageBoxResult result = MessageBox.Show(messageBoxText, caption, button, icon);

// Process message box results
switch (result)
{
    case MessageBoxResult.Yes:
        // User pressed Yes button
        // ...
        break;
    case MessageBoxResult.No:
        // User pressed No button
        // ...
        break;
    case MessageBoxResult.Cancel:
        // User pressed Cancel button
        // ...
        break;
}
' Display message box
Dim result As MessageBoxResult = MessageBox.Show(messageBoxText, caption, button, icon)

' Process message box results
Select Case result
    Case MessageBoxResult.Yes
        ' User pressed Yes button
        ' ...
    Case MessageBoxResult.No
        ' User pressed No button
        ' ...
    Case MessageBoxResult.Cancel
        ' User pressed Cancel button
        ' ...
End Select

Untuk informasi selengkapnya tentang menggunakan kotak pesan, lihat MessageBox, Sampel Kotak Pesan, dan Sampel Kotak Dialog.

Meskipun MessageBox mungkin menawarkan pengalaman pengguna kotak dialog sederhana, keuntungan menggunakan MessageBox adalah itu adalah satu-satunya jenis jendela yang dapat ditunjukkan oleh aplikasi yang berjalan dalam kotak pasir keamanan kepercayaan parsial (lihat Keamanan), seperti aplikasi browser XAML (XBAP).

Sebagian besar kotak dialog menampilkan dan mengumpulkan data yang lebih kompleks daripada hasil kotak pesan, termasuk teks, pilihan (kotak centang), pilihan yang saling eksklusif (tombol radio), dan pilihan daftar (kotak daftar, kotak kombo, kotak daftar drop-down). Untuk ini, Windows Presentation Foundation (WPF) menyediakan beberapa kotak dialog umum dan memungkinkan Anda membuat kotak dialog Anda sendiri, meskipun penggunaan keduanya terbatas pada aplikasi yang berjalan dengan kepercayaan penuh.

Kotak dialog umum

Windows menerapkan berbagai kotak dialog yang dapat digunakan kembali yang umum untuk semua aplikasi, termasuk kotak dialog untuk membuka file, menyimpan file, dan mencetak. Karena kotak dialog ini diimplementasikan oleh sistem operasi, kotak dialog dapat dibagikan di antara semua aplikasi yang berjalan pada sistem operasi, yang membantu pengguna mengalami konsistensi; ketika pengguna terbiasa dengan penggunaan kotak dialog yang disediakan sistem operasi dalam satu aplikasi, mereka tidak perlu mempelajari cara menggunakan kotak dialog tersebut di aplikasi lain. Karena kotak dialog ini tersedia untuk semua aplikasi dan karena membantu memberikan pengalaman pengguna yang konsisten, kotak dialog tersebut dikenal sebagai kotak dialog umum.

Windows Presentation Foundation (WPF) merangkum file terbuka, menyimpan file, dan mencetak kotak dialog umum dan mengeksposnya sebagai kelas terkelola untuk Anda gunakan dalam aplikasi mandiri. Topik ini memberikan gambaran singkat tentang masing-masing topik.

Dialog Buka File

Kotak dialog buka file, yang diperlihatkan dalam gambar berikut, digunakan oleh fungsionalitas pembukaan file untuk mengambil nama file yang akan dibuka.

An Open dialog box showing the location to retrieve the file.

Kotak dialog file terbuka umum diimplementasikan sebagai OpenFileDialog kelas dan terletak di Microsoft.Win32 namespace. Kode berikut menunjukkan cara membuat, mengonfigurasi, dan menampilkannya, dan cara memproses hasilnya.

// Configure open file dialog box
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show open file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process open file dialog box results
if (result == true)
{
    // Open document
    string filename = dlg.FileName;
}
' Configure open file dialog box
Dim dlg As New Microsoft.Win32.OpenFileDialog()
dlg.FileName = "Document" ' Default file name
dlg.DefaultExt = ".txt" ' Default file extension
dlg.Filter = "Text documents (.txt)|*.txt" ' Filter files by extension

' Show open file dialog box
Dim result? As Boolean = dlg.ShowDialog()

' Process open file dialog box results
If result = True Then
    ' Open document
    Dim filename As String = dlg.FileName
End If

Untuk informasi selengkapnya tentang kotak dialog buka file, lihat Microsoft.Win32.OpenFileDialog.

Catatan

OpenFileDialog dapat digunakan untuk mengambil nama file dengan aman oleh aplikasi yang berjalan dengan kepercayaan parsial (lihat Keamanan).

Kotak dialog Simpan File

Kotak dialog simpan file, yang diperlihatkan dalam gambar berikut, digunakan oleh fungsionalitas penyimpanan file untuk mengambil nama file yang akan disimpan.

A Save As dialog box showing the location to save the file.

Kotak dialog file penyimpanan umum diimplementasikan sebagai SaveFileDialog kelas, dan terletak di Microsoft.Win32 namespace. Kode berikut menunjukkan cara membuat, mengonfigurasi, dan menampilkannya, dan cara memproses hasilnya.

// Configure save file dialog box
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process save file dialog box results
if (result == true)
{
    // Save document
    string filename = dlg.FileName;
}
' Configure save file dialog box
Dim dlg As New Microsoft.Win32.SaveFileDialog()
dlg.FileName = "Document" ' Default file name
dlg.DefaultExt = ".txt" ' Default file extension
dlg.Filter = "Text documents (.txt)|*.txt" ' Filter files by extension

' Show save file dialog box
Dim result? As Boolean = dlg.ShowDialog()

' Process save file dialog box results
If result = True Then
    ' Save document
    Dim filename As String = dlg.FileName
End If

Untuk informasi selengkapnya tentang kotak dialog simpan file, lihat Microsoft.Win32.SaveFileDialog.

Kotak dialog cetak, yang diperlihatkan dalam gambar berikut, digunakan oleh fungsionalitas pencetakan untuk memilih dan mengonfigurasi printer tempat pengguna ingin mencetak data.

Screenshot that shows a Print dialog box.

Kotak dialog cetak umum diimplementasikan sebagai PrintDialog kelas, dan terletak di System.Windows.Controls namespace. Kode berikut menunjukkan cara membuat, mengonfigurasi, dan menampilkannya.

// Configure printer dialog box
System.Windows.Controls.PrintDialog dlg = new System.Windows.Controls.PrintDialog();
dlg.PageRangeSelection = PageRangeSelection.AllPages;
dlg.UserPageRangeEnabled = true;

// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process save file dialog box results
if (result == true)
{
    // Print document
}
' Configure printer dialog box
Dim dlg As New PrintDialog()
dlg.PageRangeSelection = PageRangeSelection.AllPages
dlg.UserPageRangeEnabled = True

' Show save file dialog box
Dim result? As Boolean = dlg.ShowDialog()

' Process save file dialog box results
If result = True Then
    ' Print document
End If

Untuk informasi selengkapnya tentang kotak dialog cetak, lihat System.Windows.Controls.PrintDialog. Untuk diskusi terperinci tentang pencetakan di WPF, lihat Gambaran Umum Pencetakan.

Kotak dialog kustom

Meskipun kotak dialog umum berguna, dan harus digunakan jika memungkinkan, kotak dialog tersebut tidak mendukung persyaratan kotak dialog khusus domain. Dalam kasus ini, Anda perlu membuat kotak dialog Anda sendiri. Seperti yang akan kita lihat, kotak dialog adalah jendela dengan perilaku khusus. Window menerapkan perilaku tersebut dan, akibatnya, Anda menggunakan Window untuk membuat kotak dialog modal dan modeless kustom.

Membuat kotak dialog kustom modal

Topik ini memperlihatkan cara menggunakan Window untuk membuat implementasi kotak dialog modal umum, menggunakan Margins kotak dialog sebagai contoh (lihat Sampel Kotak Dialog). Kotak Margins dialog diperlihatkan dalam gambar berikut.

A Margins dialog box with fields to define left margin, top margin, right margin, and bottom margin.

Mengonfigurasi kotak dialog modal

Kotak dialog antarmuka pengguna untuk umum mencakup yang berikut ini:

  • Berbagai kontrol yang diperlukan untuk mengumpulkan data yang diinginkan.

  • Tombol OK yang diklik pengguna untuk menutup kotak dialog, kembali ke fungsi, dan melanjutkan pemrosesan.

  • Tombol Batalkan yang diklik pengguna untuk menutup kotak dialog dan menghentikan fungsi dari pemrosesan lebih lanjut.

  • Tombol Tutup di bilah judul.

  • Ikon.

  • Tombol Minimalkan, Maksimalkan, dan Pulihkan .

  • Menu Sistem untuk meminimalkan, memaksimalkan, memulihkan, dan menutup kotak dialog.

  • Posisi di atas dan di tengah jendela yang membuka kotak dialog.

  • Kemampuan untuk diubah ukurannya jika memungkinkan untuk mencegah kotak dialog terlalu kecil, dan untuk memberi pengguna ukuran default yang berguna. Ini mengharuskan Anda mengatur dimensi default dan minimum.

  • Tombol ESC sebagai pintasan keyboard yang menyebabkan tombol Batal ditekan. Anda melakukan ini dengan mengatur IsCancel properti tombol Batalkan ke true.

  • Tombol ENTER (atau RETURN) sebagai pintasan keyboard yang menyebabkan tombol OK ditekan. Anda melakukan ini dengan mengatur IsDefault properti tombol trueOK .

Kode berikut menunjukkan konfigurasi ini.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarginsDialogBox"
    xmlns:local="clr-namespace:SDKSample"
    Title="Margins"
    Height="190"
    Width="300"
    MinHeight="10"
    MinWidth="300"
    ResizeMode="CanResizeWithGrip"
    ShowInTaskbar="False"
    WindowStartupLocation="CenterOwner" 
    FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">

  <Grid>
    <!-- Accept or Cancel -->
    <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4">
      <Button Name="okButton" Click="okButton_Click" IsDefault="True">OK</Button>
      <Button Name="cancelButton" IsCancel="True">Cancel</Button>
    </StackPanel>
  </Grid >
</Window>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {
        public MarginsDialogBox()
        {
            InitializeComponent();
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input

Namespace SDKSample
    Public Class MarginsDialogBox
        Inherits Window

        Public Sub New()
            Me.InitializeComponent()
        End Sub
    End Class
End Namespace

Pengalaman pengguna untuk kotak dialog juga meluas ke bilah menu jendela yang membuka kotak dialog. Saat item menu menjalankan fungsi yang memerlukan interaksi pengguna melalui kotak dialog sebelum fungsi dapat dilanjutkan, item menu untuk fungsi akan memiliki elipsis di headernya, seperti yang ditunjukkan di sini.

<!--Main Window-->
<MenuItem Name="formatMarginsMenuItem" Header="_Margins..." Click="formatMarginsMenuItem_Click" />

Saat item menu menjalankan fungsi yang menampilkan kotak dialog yang tidak memerlukan interaksi pengguna, seperti kotak dialog Tentang, elipsis tidak diperlukan.

Membuka kotak dialog modal

Kotak dialog biasanya ditampilkan sebagai hasil dari pengguna yang memilih item menu untuk melakukan fungsi khusus domain, seperti mengatur margin dokumen dalam prosesor kata. Memperlihatkan jendela sebagai kotak dialog mirip dengan memperlihatkan jendela normal, meskipun memerlukan konfigurasi khusus kotak dialog tambahan. Seluruh proses membuat instans, mengonfigurasi, dan membuka kotak dialog diperlihatkan dalam kode berikut.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;

namespace SDKSample
{
    public partial class MainWindow : Window
    {
        bool needsToBeSaved;
        void formatMarginsMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Instantiate the dialog box
            MarginsDialogBox dlg = new MarginsDialogBox();

            // Configure the dialog box
            dlg.Owner = this;
            dlg.DocumentMargin = this.documentTextBox.Margin;

            // Open the dialog box modally
            dlg.ShowDialog();
        }
    }
}
Imports System.ComponentModel
Imports System.Windows
Imports System.Windows.Controls
Imports Microsoft.Win32

Namespace SDKSample
    Public Class MainWindow
        Inherits Window
        
        Private Sub formatMarginsMenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Instantiate the dialog box
            Dim dlg As New MarginsDialogBox

            ' Configure the dialog box
            dlg.Owner = Me
            dlg.DocumentMargin = Me.documentTextBox.Margin

            ' Open the dialog box modally 
            dlg.ShowDialog()
        End Sub
    End Class
End Namespace

Di sini, kode meneruskan informasi default (margin saat ini) ke kotak dialog. Ini juga mengatur Window.Owner properti dengan referensi ke jendela yang memperlihatkan kotak dialog. Secara umum, Anda harus selalu mengatur pemilik untuk kotak dialog untuk menyediakan perilaku terkait status jendela yang umum untuk semua kotak dialog (lihat Gambaran Umum Windows WPF untuk informasi selengkapnya).

Catatan

Anda harus menyediakan pemilik untuk mendukung otomatisasi antarmuka pengguna (UI) untuk kotak dialog (lihat Gambaran Umum Automasi UI).

Setelah kotak dialog dikonfigurasi, kotak dialog ditampilkan secara modal dengan memanggil ShowDialog metode .

Memvalidasi data yang disediakan pengguna

Saat kotak dialog dibuka dan pengguna menyediakan data yang diperlukan, kotak dialog bertanggung jawab untuk memastikan bahwa data yang disediakan valid karena alasan berikut:

  • Dari perspektif keamanan, semua input harus divalidasi.

  • Dari perspektif khusus domain, validasi data mencegah data yang salah diproses oleh kode, yang berpotensi melempar pengecualian.

  • Dari perspektif pengalaman pengguna, kotak dialog dapat membantu pengguna dengan menunjukkan kepada mereka data mana yang telah mereka masukkan tidak valid.

  • Dari perspektif performa, validasi data dalam aplikasi multi-tingkat dapat mengurangi jumlah perjalanan pulang pergi antara klien dan tingkat aplikasi, terutama ketika aplikasi terdiri dari layanan Web atau database berbasis server.

Untuk memvalidasi kontrol terikat di WPF, Anda perlu menentukan aturan validasi dan mengaitkannya dengan pengikatan. Aturan validasi adalah kelas kustom yang berasal dari ValidationRule. Contoh berikut menunjukkan aturan validasi, MarginValidationRule, yang memeriksa apakah nilai terikat adalah Double dan berada dalam rentang tertentu.

using System.Globalization;
using System.Windows.Controls;

namespace SDKSample
{
    public class MarginValidationRule : ValidationRule
    {
        double minMargin;
        double maxMargin;

        public double MinMargin
        {
            get { return this.minMargin; }
            set { this.minMargin = value; }
        }

        public double MaxMargin
        {
            get { return this.maxMargin; }
            set { this.maxMargin = value; }
        }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            double margin;

            // Is a number?
            if (!double.TryParse((string)value, out margin))
            {
                return new ValidationResult(false, "Not a number.");
            }

            // Is in range?
            if ((margin < this.minMargin) || (margin > this.maxMargin))
            {
                string msg = string.Format("Margin must be between {0} and {1}.", this.minMargin, this.maxMargin);
                return new ValidationResult(false, msg);
            }

            // Number is valid
            return new ValidationResult(true, null);
        }
    }
}
Imports System.Globalization
Imports System.Windows.Controls

Namespace SDKSample
    Public Class MarginValidationRule
        Inherits ValidationRule

        Private _maxMargin As Double
        Private _minMargin As Double

        Public Property MaxMargin() As Double
            Get
                Return Me._maxMargin
            End Get
            Set(ByVal value As Double)
                Me._maxMargin = value
            End Set
        End Property

        Public Property MinMargin() As Double
            Get
                Return Me._minMargin
            End Get
            Set(ByVal value As Double)
                Me._minMargin = value
            End Set
        End Property

        Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As CultureInfo) As ValidationResult
            Dim margin As Double

            ' Is a number?
            If Not Double.TryParse(CStr(value), margin) Then
                Return New ValidationResult(False, "Not a number.")
            End If

            ' Is in range?
            If ((margin < Me.MinMargin) OrElse (margin > Me.MaxMargin)) Then
                Dim msg As String = String.Format("Margin must be between {0} and {1}.", Me.MinMargin, Me.MaxMargin)
                Return New ValidationResult(False, msg)
            End If

            ' Number is valid
            Return New ValidationResult(True, Nothing)
        End Function
    End Class
End Namespace

Dalam kode ini, logika validasi aturan validasi diimplementasikan dengan mengambil alih Validate metode , yang memvalidasi data dan mengembalikan yang sesuai ValidationResult.

Untuk mengaitkan aturan validasi dengan kontrol terikat, Anda menggunakan markup berikut.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarginsDialogBox"
    xmlns:local="clr-namespace:SDKSample"
    Title="Margins"
    Height="190"
    Width="300"
    MinHeight="10"
    MinWidth="300"
    ResizeMode="CanResizeWithGrip"
    ShowInTaskbar="False"
    WindowStartupLocation="CenterOwner" 
    FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">

  <Grid>

    <!-- Left Margin -->
    <Label Grid.Column="0" Grid.Row="0">Left Margin:</Label>
    <TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0">
      <TextBox.Text>
        <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
          <Binding.ValidationRules>
            <local:MarginValidationRule MinMargin="0" MaxMargin="10" />
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
  </Grid >
</Window>

Setelah aturan validasi dikaitkan, WPF akan secara otomatis menerapkannya ketika data dimasukkan ke dalam kontrol terikat. Ketika kontrol berisi data yang tidak valid, WPF akan menampilkan batas merah di sekitar kontrol yang tidak valid, seperti yang ditunjukkan pada gambar berikut.

A Margins dialog box with a red border around the invalid left margin value.

WPF tidak membatasi pengguna ke kontrol yang tidak valid sampai mereka memasukkan data yang valid. Ini adalah perilaku yang baik untuk kotak dialog; pengguna harus dapat dengan bebas menavigasi kontrol dalam kotak dialog apakah data valid atau tidak. Namun, ini berarti pengguna dapat memasukkan data yang tidak valid dan menekan tombol OK . Untuk alasan ini, kode Anda juga perlu memvalidasi semua kontrol dalam kotak dialog saat tombol OK ditekan dengan menangani Click peristiwa.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {
        void okButton_Click(object sender, RoutedEventArgs e)
        {
            // Don't accept the dialog box if there is invalid data
            if (!IsValid(this)) return;
        }

        // Validate all dependency objects in a window
        bool IsValid(DependencyObject node)
        {
            // Check if dependency object was passed
            if (node != null)
            {
                // Check if dependency object is valid.
                // NOTE: Validation.GetHasError works for controls that have validation rules attached
                bool isValid = !Validation.GetHasError(node);
                if (!isValid)
                {
                    // If the dependency object is invalid, and it can receive the focus,
                    // set the focus
                    if (node is IInputElement) Keyboard.Focus((IInputElement)node);
                    return false;
                }
            }

            // If this dependency object is valid, check all child dependency objects
            foreach (object subnode in LogicalTreeHelper.GetChildren(node))
            {
                if (subnode is DependencyObject)
                {
                    // If a child dependency object is invalid, return false immediately,
                    // otherwise keep checking
                    if (IsValid((DependencyObject)subnode) == false) return false;
                }
            }

            // All dependency objects are valid
            return true;
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input

Namespace SDKSample
    Public Class MarginsDialogBox
        Inherits Window

        Private Sub okButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Don't accept the dialog box if there is invalid data
            If Not Me.IsValid(Me) Then Return
        End Sub

        ' Validate all dependency objects in a window
        Private Function IsValid(ByVal node As DependencyObject) As Boolean
            ' Check if dependency object was passed and if dependency object is valid.
            ' NOTE: Validation.GetHasError works for controls that have validation rules attached 
            If ((Not node Is Nothing) AndAlso Validation.GetHasError(node)) Then
                ' If the dependency object is invalid, and it can receive the focus,
                ' set the focus
                If TypeOf node Is IInputElement Then
                    Keyboard.Focus(DirectCast(node, IInputElement))
                End If
                Return False
            End If

            ' If this dependency object is valid, check all child dependency objects
            Dim subnode As Object
            For Each subnode In LogicalTreeHelper.GetChildren(node)
                If (TypeOf subnode Is DependencyObject AndAlso Not Me.IsValid(DirectCast(subnode, DependencyObject))) Then
                    ' If a child dependency object is invalid, return false immediately,
                    ' otherwise keep checking
                    Return False
                End If
            Next

            ' All dependency objects are valid
            Return True
        End Function
    End Class
End Namespace

Kode ini menghitung semua objek dependensi pada jendela dan, jika ada yang tidak valid (seperti yang dikembalikan oleh GetHasError, kontrol yang tidak valid mendapatkan fokus, IsValid metode mengembalikan false, dan jendela dianggap tidak valid.

Setelah kotak dialog valid, kotak dialog dapat ditutup dan dikembalikan dengan aman. Sebagai bagian dari proses pengembalian, perlu mengembalikan hasil ke fungsi panggilan.

Mengatur hasil dialog modal

Membuka kotak dialog menggunakan ShowDialog pada dasarnya seperti memanggil metode: kode yang membuka kotak dialog menggunakan ShowDialog tunggu hingga ShowDialog kembali. Ketika ShowDialog kembali, kode yang memanggilnya perlu memutuskan apakah akan terus memproses atau berhenti memproses, berdasarkan apakah pengguna menekan tombol OK atau tombol Batal . Untuk memfasilitasi keputusan ini, kotak dialog perlu mengembalikan pilihan pengguna sebagai Boolean nilai yang dikembalikan dari ShowDialog metode .

Ketika tombol OK diklik, ShowDialog harus mengembalikan true. Ini dicapai dengan mengatur DialogResult properti kotak dialog saat tombol OK diklik.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {

        void okButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input

Namespace SDKSample
    Public Class MarginsDialogBox
        Inherits Window

        Private Sub okButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Dialog box accepted
            MyBase.DialogResult = New Nullable(Of Boolean)(True)
        End Sub
    End Class
End Namespace

Perhatikan bahwa mengatur DialogResult properti juga menyebabkan jendela ditutup secara otomatis, yang meringankan kebutuhan untuk secara eksplisit memanggil Close.

Ketika tombol Batal diklik, ShowDialog harus mengembalikan false, yang juga memerlukan pengaturan DialogResult properti.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {

        void cancelButton_Click(object sender, RoutedEventArgs e)
        {
            // Dialog box canceled
            this.DialogResult = false;
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input

Namespace SDKSample
    Public Class MarginsDialogBox
        Inherits Window

        Private Sub cancelButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Dialog box canceled
            Me.DialogResult = False
        End Sub
    End Class
End Namespace

Saat properti tombol diatur ke true dan pengguna menekan tombol Batalkan atau tombol ESC, DialogResult secara otomatis diatur ke false.IsCancel Markup berikut memiliki efek yang sama dengan kode sebelumnya, tanpa perlu menangani Click peristiwa.

<Button Name="cancelButton" IsCancel="True">Cancel</Button>

Kotak dialog secara otomatis kembali false saat pengguna menekan tombol Tutup di bilah judul atau memilih item menu Tutup dari menu Sistem .

Memproses data yang dikembalikan dari kotak dialog modal

Ketika DialogResult diatur oleh kotak dialog, fungsi yang membukanya bisa mendapatkan hasil kotak dialog dengan memeriksa DialogResult properti saat ShowDialog dikembalikan.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;

namespace SDKSample
{
    public partial class MainWindow : Window
    {

        void formatMarginsMenuItem_Click(object sender, RoutedEventArgs e)
        {

            // Process data entered by user if dialog box is accepted
            if (dlg.DialogResult == true)
            {
                // Update fonts
                this.documentTextBox.Margin = dlg.DocumentMargin;
            }
        }
    }
}
Imports System.ComponentModel
Imports System.Windows
Imports System.Windows.Controls
Imports Microsoft.Win32

Namespace SDKSample
    Public Class MainWindow
        Inherits Window
        
        Private Sub formatMarginsMenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Process data entered by user if dialog box is accepted
            If (dlg.DialogResult.GetValueOrDefault = True) Then
                Me.documentTextBox.Margin = dlg.DocumentMargin
            End If
        End Sub
    End Class
End Namespace

Jika hasil dialog adalah true, fungsi menggunakannya sebagai isensi untuk mengambil dan memproses data yang disediakan oleh pengguna.

Catatan

Setelah ShowDialog dikembalikan, kotak dialog tidak dapat dibuka kembali. Sebagai gantinya, Anda perlu membuat instans baru.

Jika hasil dialog adalah false, fungsi harus mengakhiri pemrosesan dengan tepat.

Membuat kotak dialog kustom tanpa mode

Kotak dialog tanpa mode, seperti Kotak Dialog Temukan yang diperlihatkan dalam gambar berikut, memiliki tampilan mendasar yang sama dengan kotak dialog modal.

Screenshot that shows a Find dialog box.

Namun, perilakunya sedikit berbeda, seperti yang dijelaskan di bagian berikut.

Membuka kotak dialog tanpa mode

Kotak dialog tanpa mode dibuka dengan memanggil Show metode .

<!--Main Window-->
<MenuItem Name="editFindMenuItem" Header="_Find" InputGestureText="Ctrl+F" Click="editFindMenuItem_Click" />
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;

namespace SDKSample
{
    public partial class MainWindow : Window
    {
        void editFindMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Instantiate the dialog box
            FindDialogBox dlg = new FindDialogBox(this.documentTextBox);

            // Configure the dialog box
            dlg.Owner = this;
            dlg.TextFound += new TextFoundEventHandler(dlg_TextFound);

            // Open the dialog box modally
            dlg.Show();
        }
    }
}
Imports System.ComponentModel
Imports System.Windows
Imports System.Windows.Controls
Imports Microsoft.Win32

Namespace SDKSample
    Public Class MainWindow
        Inherits Window
        
        Private Sub editFindMenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Dim dlg As New FindDialogBox(Me.documentTextBox)
            dlg.Owner = Me
            AddHandler dlg.TextFound, New TextFoundEventHandler(AddressOf Me.dlg_TextFound)
            dlg.Show()
        End Sub
    End Class
End Namespace

Tidak seperti ShowDialog, Show segera kembali. Akibatnya, jendela panggilan tidak dapat memberi tahu kapan kotak dialog tanpa mode tertutup dan, oleh karena itu, tidak tahu kapan harus memeriksa hasil kotak dialog atau mendapatkan data dari kotak dialog untuk pemrosesan lebih lanjut. Sebagai gantinya, kotak dialog perlu membuat cara alternatif untuk mengembalikan data ke jendela panggilan untuk diproses.

Memproses data yang dikembalikan dari kotak dialog tanpa mode

Dalam contoh ini, FindDialogBox dapat mengembalikan satu atau beberapa hasil temuan ke jendela utama, tergantung pada teks yang dicari tanpa frekuensi tertentu. Seperti halnya kotak dialog modal, kotak dialog tanpa mode dapat mengembalikan hasil menggunakan properti. Namun, jendela yang memiliki kotak dialog perlu mengetahui kapan harus memeriksa properti tersebut. Salah satu cara untuk mengaktifkan ini adalah untuk kotak dialog untuk mengimplementasikan peristiwa yang dinaikkan setiap kali teks ditemukan. FindDialogBoxTextFoundEvent mengimplementasikan untuk tujuan ini, yang pertama-tama memerlukan delegasi.

using System;

namespace SDKSample
{
    public delegate void TextFoundEventHandler(object sender, EventArgs e);
}
Namespace SDKSample
   Public Delegate Sub TextFoundEventHandler(ByVal sender As Object, ByVal e As EventArgs)
End Namespace

TextFoundEventHandler Menggunakan delegasi, FindDialogBox mengimplementasikan TextFoundEvent.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Text.RegularExpressions;

namespace SDKSample
{
    public partial class FindDialogBox : Window
    {
        public event TextFoundEventHandler TextFound;

        protected virtual void OnTextFound()
        {
            TextFoundEventHandler textFound = this.TextFound;
            if (textFound != null) textFound(this, EventArgs.Empty);
        }

    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Text.RegularExpressions

Namespace SDKSample

    Public Class FindDialogBox
        Inherits Window

        Public Event TextFound As TextFoundEventHandler

        Protected Overridable Sub OnTextFound()
            RaiseEvent TextFound(Me, EventArgs.Empty)
        End Sub

    End Class
End Namespace

Akibatnya, Find dapat menaikkan peristiwa saat hasil pencarian ditemukan.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Text.RegularExpressions;

namespace SDKSample
{
    public partial class FindDialogBox : Window
    {

        void findNextButton_Click(object sender, RoutedEventArgs e)
        {
                // Text found
                this.index = match.Index;
                this.length = match.Length;
                OnTextFound();
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Text.RegularExpressions

Namespace SDKSample

    Public Class FindDialogBox
        Inherits Window



            Me.Index = match.Index
            Me.Length = match.Length
            RaiseEvent TextFound(Me, EventArgs.Empty)

    End Class
End Namespace

Jendela pemilik kemudian perlu mendaftar dan menangani peristiwa ini.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;

namespace SDKSample
{
    public partial class MainWindow : Window
    {

        void dlg_TextFound(object sender, EventArgs e)
        {
            // Get the find dialog box that raised the event
            FindDialogBox dlg = (FindDialogBox)sender;

            // Get find results and select found text
            this.documentTextBox.Select(dlg.Index, dlg.Length);
            this.documentTextBox.Focus();
        }
    }
}
Imports System.ComponentModel
Imports System.Windows
Imports System.Windows.Controls
Imports Microsoft.Win32

Namespace SDKSample
    Public Class MainWindow
        Inherits Window
        
        Private Sub dlg_TextFound(ByVal sender As Object, ByVal e As EventArgs)
            Dim dlg As FindDialogBox = DirectCast(sender, FindDialogBox)
            Me.documentTextBox.Select(dlg.Index, dlg.Length)
            Me.documentTextBox.Focus()
        End Sub
    End Class
End Namespace

Menutup kotak dialog tanpa mode

Karena DialogResult tidak perlu diatur, dialog tanpa mode dapat ditutup menggunakan mekanisme penyediaan sistem, termasuk yang berikut ini:

  • Mengklik tombol Tutup di bilah judul.

  • Menekan ALT+F4.

  • Memilih Tutup dari menu Sistem .

Atau, kode Anda dapat memanggil Close saat tombol Tutup diklik.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Text.RegularExpressions;

namespace SDKSample
{
    public partial class FindDialogBox : Window
    {

        void closeButton_Click(object sender, RoutedEventArgs e)
        {
            // Close dialog box
            this.Close();
        }
    }
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Text.RegularExpressions

Namespace SDKSample

    Public Class FindDialogBox
        Inherits Window

        Private Sub closeButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            MyBase.Close()
        End Sub
    End Class
End Namespace

Baca juga