İletişim kutularına genel bakış

Tek başına uygulamalar genellikle hem uygulamanın üzerinde çalıştığı ana verileri görüntüleyen hem de menü çubukları, araç çubukları ve durum çubukları gibi kullanıcı arabirimi (UI) mekanizmaları aracılığıyla bu verileri işleme işlevini kullanıma sunan bir ana pencereye sahiptir. Önemsiz olmayan bir uygulama, aşağıdakileri yapmak için ek pencereler de görüntüleyebilir:

  • Kullanıcılara belirli bilgileri görüntüleme.

  • Kullanıcılardan bilgi toplayın.

  • Hem görüntüler hem de bilgi toplar.

Bu pencere türleri iletişim kutusu olarak bilinir ve iki tür vardır: kalıcı ve modsuz.

İşlevin devam etmek için kullanıcıdan ek verilere ihtiyacı olduğunda işlev tarafından kalıcı bir iletişim kutusu görüntülenir. İşlev, veri toplamak için kalıcı iletişim kutusuna bağlı olduğundan, kalıcı iletişim kutusu kullanıcının açık kalırken uygulamadaki diğer pencereleri etkinleştirmesini de engeller. Çoğu durumda, kalıcı iletişim kutusu kullanıcının tamam veya İptal düğmesine basarak kalıcı iletişim kutusuyla işi bittiğinde sinyal göndermesine olanak tanır. Tamam düğmesine basmak, kullanıcının veri girdiğinizi ve işlevin bu verilerle işlemeye devam etmek istediğini gösterir. İptal düğmesine basmak, kullanıcının işlevin yürütülmesini tamamen durdurmak istediğini gösterir. Verileri açmak, kaydetmek ve yazdırmak için en yaygın kalıcı iletişim kutuları örnekleri gösterilir.

Öte yandan, modsuz iletişim kutusu, kullanıcının açıkken diğer pencereleri etkinleştirmesini engellemez. Örneğin, bir kullanıcı belgede belirli bir sözcüğün oluşumlarını bulmak isterse, ana pencere genellikle kullanıcıya hangi sözcüğü aradıklarını soran bir iletişim kutusu açar. Ancak bir sözcüğü bulmak kullanıcının belgeyi düzenlemesini engellemediğinden iletişim kutusunun kalıcı olması gerekmez. Modsuz iletişim kutusu en azından iletişim kutusunu kapatmak için Bir Kapat düğmesi sağlar ve belirli işlevleri yürütmek için ek düğmeler sağlayabilir. Örneğin, bir sözcük aramasının bulma ölçütleriyle eşleşen sonraki sözcüğü bulmak için Sonrakini Bul düğmesi gibi.

Windows Presentation Foundation (WPF), ileti kutuları, ortak iletişim kutuları ve özel iletişim kutuları gibi çeşitli iletişim kutuları oluşturmanıza olanak tanır. Bu konuda her bir konu ele alınmıştır ve İletişim Kutusu Örneği eşleşen örnekler sağlar.

İleti kutuları

İleti kutusu, metin bilgilerini görüntülemek ve kullanıcıların düğmelerle karar vermesine olanak sağlamak için kullanılabilen bir iletişim kutusudur. Aşağıdaki şekilde metin bilgilerini görüntüleyen, soru soran ve kullanıcıya soruyu yanıtlamak için üç düğme sağlayan bir ileti kutusu gösterilmektedir.

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

İleti kutusu oluşturmak için sınıfını MessageBox kullanırsınız. MessageBox aşağıdaki gibi bir kod kullanarak ileti kutusu metnini, başlığını, simgesini ve düğmelerini yapılandırmanızı sağlar.

// 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

İleti kutusunu göstermek için aşağıdaki kodda staticShow gösterildiği gibi yöntemini çağırırsınız.

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

İleti kutusunu gösteren kodun kullanıcının kararını (hangi düğmeye basıldı) algılaması ve işlemesi gerektiğinde, kod aşağıdaki kodda gösterildiği gibi ileti kutusu sonucunu inceleyebilir.

// 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

İleti kutularını kullanma hakkında daha fazla bilgi için bkz MessageBox. , MessageBox Örneği ve İletişim Kutusu Örneği.

Basit bir iletişim kutusu kullanıcı deneyimi sunsa da MessageBox , kullanmanın MessageBox avantajı XAML tarayıcı uygulamaları (XBAP'ler) gibi kısmi güven güvenlik korumalı alanı içinde çalışan uygulamalar tarafından gösterilebilen tek pencere türüdür (bkz . Güvenlik).

Çoğu iletişim kutusu metin, seçim (onay kutuları), birbirini dışlayan seçim (radyo düğmeleri) ve liste seçimi (liste kutuları, birleşik giriş kutuları, açılan liste kutuları) gibi ileti kutusunun sonucundan daha karmaşık veriler görüntüler ve toplar. Bunlar için, Windows Presentation Foundation (WPF) birçok yaygın iletişim kutusu sağlar ve kendi iletişim kutularınızı oluşturmanıza olanak tanır, ancak bunların kullanımı tam güvenle çalışan uygulamalarla sınırlıdır.

Ortak iletişim kutuları

Windows, dosyaları açmak, dosyaları kaydetmek ve yazdırmak için iletişim kutuları da dahil olmak üzere tüm uygulamalar için ortak olan çeşitli yeniden kullanılabilir iletişim kutuları uygular. Bu iletişim kutuları işletim sistemi tarafından uygulandığından, bunlar işletim sisteminde çalışan tüm uygulamalar arasında paylaşılabilir ve bu da kullanıcının tutarlılık deneyimine yardımcı olur; kullanıcıların bir uygulamada işletim sistemi tarafından sağlanan bir iletişim kutusunun kullanımı hakkında bilgi sahibi olduklarında, bu iletişim kutusunun diğer uygulamalarda nasıl kullanılacağını öğrenmeleri gerekmez. Bu iletişim kutuları tüm uygulamalar tarafından kullanılabildiğinden ve tutarlı bir kullanıcı deneyimi sağlamaya yardımcı olduğundan, yaygın iletişim kutuları olarak bilinirler.

Windows Presentation Foundation (WPF) açık dosyayı kapsüller, dosyayı kaydeder ve ortak iletişim kutularını yazdırır ve bunları tek başına uygulamalarda kullanmanız için yönetilen sınıflar olarak kullanıma sunar. Bu konu başlığında her birine kısa bir genel bakış sağlanır.

Dosya Aç iletişim kutusu

Aşağıdaki şekilde gösterilen dosya aç iletişim kutusu, açılacak dosyanın adını almak için dosya açma işlevi tarafından kullanılır.

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

Ortak açık dosya iletişim kutusu sınıf olarak OpenFileDialog uygulanır ve ad alanında Microsoft.Win32 bulunur. Aşağıdaki kodda bir tane oluşturma, yapılandırma ve gösterme ve sonucu işleme adımları gösterilmektedir.

// 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

Dosya aç iletişim kutusu hakkında daha fazla bilgi için bkz Microsoft.Win32.OpenFileDialog. .

Dekont

OpenFileDialog , kısmi güvenle çalışan uygulamalar tarafından dosya adlarını güvenli bir şekilde almak için kullanılabilir (bkz . Güvenlik).

Dosya Kaydet iletişim kutusu

Aşağıdaki şekilde gösterilen dosyayı kaydet iletişim kutusu, kaydedilecek dosyanın adını almak için dosya kaydetme işlevi tarafından kullanılır.

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

Ortak kaydetme dosyası iletişim kutusu sınıf olarak SaveFileDialog uygulanır ve ad alanında Microsoft.Win32 bulunur. Aşağıdaki kodda bir tane oluşturma, yapılandırma ve gösterme ve sonucu işleme adımları gösterilmektedir.

// 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

Dosyayı kaydet iletişim kutusu hakkında daha fazla bilgi için bkz Microsoft.Win32.SaveFileDialog. .

Aşağıdaki şekilde gösterilen yazdır iletişim kutusu, bir kullanıcının verileri yazdırmak istediğiniz yazıcıyı seçmek ve yapılandırmak için yazdırma işlevi tarafından kullanılır.

Screenshot that shows a Print dialog box.

Ortak yazdırma iletişim kutusu sınıfı olarak PrintDialog uygulanır ve ad alanında System.Windows.Controls bulunur. Aşağıdaki kodda oluşturma, yapılandırma ve gösterme gösterilmektedir.

// 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

Yazdır iletişim kutusu hakkında daha fazla bilgi için bkz System.Windows.Controls.PrintDialog. . WPF'de yazdırma hakkında ayrıntılı bilgi için bkz . Yazdırmaya Genel Bakış.

Özel iletişim kutuları

Ortak iletişim kutuları yararlı olsa da ve mümkün olduğunda kullanılmalıdır, ancak etki alanına özgü iletişim kutularının gereksinimlerini desteklemez. Böyle durumlarda, kendi iletişim kutularınızı oluşturmanız gerekir. Göreceğimiz gibi, iletişim kutusu özel davranışlara sahip bir penceredir. Window bu davranışları uygular ve sonuç olarak, özel kalıcı ve modsuz iletişim kutuları oluşturmak için kullanırsınız Window .

Kalıcı özel iletişim kutusu oluşturma

Bu konuda, örnek olarak iletişim kutusunu kullanarak Margins tipik bir kalıcı iletişim kutusu uygulaması oluşturmak için nasıl kullanılacağı Window gösterilmektedir (bkz. İletişim Kutusu Örneği). İletişim Margins kutusu aşağıdaki şekilde gösterilmiştir.

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

Kalıcı iletişim kutusunu yapılandırma

Tipik bir iletişim kutusunun kullanıcı arabirimi aşağıdakileri içerir:

  • İstenen verileri toplamak için gereken çeşitli denetimler.

  • Kullanıcıların iletişim kutusunu kapatmak, işleve geri dönmek ve işlemeye devam etmek için tıklatacakları Tamam düğmesi.

  • kullanıcıların iletişim kutusunu kapatmak ve işlevin daha fazla işlenmesini durdurmak için tıklattığını İptal düğmesi.

  • Başlık çubuğundaki Kapat düğmesi.

  • Bir simge.

  • Simge Durumuna Küçült, Ekranı Kapla ve Geri Yükle düğmeleri.

  • İletişim kutusunu simge durumuna küçültmek, ekranı kaplamak, geri yüklemek ve kapatmak için bir Sistem menüsü.

  • İletişim kutusunu açan pencerenin üstünde ve ortasında bir konum.

  • İletişim kutusunun çok küçük olmasını önlemek ve kullanıcıya kullanışlı bir varsayılan boyut sağlamak için mümkün olduğunda yeniden boyutlandırılabilir. Bunun için hem varsayılan hem de en düşük boyutları ayarlamanız gerekir.

  • İptal düğmesine basmaya neden olan klavye kısayolu olarak ESC tuşu. Bunu, İptal düğmesinin IsCancelözelliğini olarak trueayarlayarak yaparsınız.

  • Tamam düğmesine basmaya neden olan klavye kısayolu olarak ENTER (veya RETURN) tuşu. Bunu, Tamam düğmesinin trueIsDefaultözelliğini ayarlayarak yaparsınız.

Aşağıdaki kod bu yapılandırmayı gösterir.

<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

İletişim kutusunun kullanıcı deneyimi, iletişim kutusunu açan pencerenin menü çubuğuna da genişletir. Bir menü öğesi, işlevin devam etmesi için bir iletişim kutusu üzerinden kullanıcı etkileşimi gerektiren bir işlev çalıştırdığında, burada gösterildiği gibi, işlevin menü öğesinin üst bilgisinde bir üç nokta bulunur.

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

Menü öğesi Hakkında iletişim kutusu gibi kullanıcı etkileşimi gerektirmeyen bir iletişim kutusu görüntüleyen bir işlev çalıştırdığında üç nokta gerekmez.

Kalıcı iletişim kutusu açma

İletişim kutusu genellikle kullanıcının etki alanına özgü bir işlevi gerçekleştirmek için bir menü öğesi seçmesinin sonucu olarak gösterilir. Örneğin, sözcük işlemcisinde belgenin kenar boşluklarını ayarlama. Bir pencereyi iletişim kutusu olarak göstermek normal bir pencereyi göstermeye benzer, ancak iletişim kutusuna özgü ek yapılandırma gerektirir. İletişim kutusunu örnekleme, yapılandırma ve açma işleminin tamamı aşağıdaki kodda gösterilir.

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

Burada kod, varsayılan bilgileri (geçerli kenar boşlukları) iletişim kutusuna geçirir. Ayrıca, iletişim kutusunu gösteren pencereye bir başvuru ile özelliğini ayarlar Window.Owner . Genel olarak, bir iletişim kutusunun sahibini her zaman tüm iletişim kutuları için ortak olan pencere durumuyla ilgili davranışlar sağlayacak şekilde ayarlamanız gerekir (daha fazla bilgi için bkz . WPF Windows'a Genel Bakış ).

Dekont

İletişim kutuları için kullanıcı arabirimi (UI) otomasyonlarını desteklemek üzere bir sahip sağlamanız gerekir (bkz. UI Otomasyonu Genel Bakış).

İletişim kutusu yapılandırıldıktan sonra, yöntemi çağrılarak ShowDialog mod olarak gösterilir.

Kullanıcı tarafından sağlanan verileri doğrulama

Bir iletişim kutusu açıldığında ve kullanıcı gerekli verileri sağladığında, sağlanan verilerin aşağıdaki nedenlerle geçerli olduğundan emin olmak bir iletişim kutusu sorumludur:

  • Güvenlik açısından bakıldığında tüm girişlerin doğrulanması gerekir.

  • Etki alanına özgü bir perspektiften bakıldığında, veri doğrulama hatalı verilerin kod tarafından işlenmesini engeller ve bu da özel durumlar oluşturabilir.

  • Kullanıcı deneyimi açısından bakıldığında, bir iletişim kutusu kullanıcılara hangi verilerin geçersiz olduğunu göstererek yardımcı olabilir.

  • Performans açısından bakıldığında, çok katmanlı bir uygulamada veri doğrulaması, özellikle de uygulama Web hizmetlerinden veya sunucu tabanlı veritabanlarından oluştuğunda istemci ile uygulama katmanları arasındaki gidiş dönüş sayısını azaltabilir.

WPF'de ilişkili bir denetimi doğrulamak için bir doğrulama kuralı tanımlamanız ve bunu bağlamayla ilişkilendirmeniz gerekir. Geçerlilik kuralı, öğesinden ValidationRuletüretilen özel bir sınıftır. Aşağıdaki örnekte, MarginValidationRuleilişkili bir değerin bir ve değerinin belirtilen aralıkta olup Double olmadığını denetleyen bir geçerlilik kuralı gösterilmektedir.

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

Bu kodda, doğrulama kuralının doğrulama mantığı, verileri doğrulayan ve uygun ValidationResultbir döndürür yöntemi geçersiz kılınarak Validate uygulanır.

Doğrulama kuralını ilişkili denetimle ilişkilendirmek için aşağıdaki işaretlemeyi kullanırsınız.

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

Doğrulama kuralı ilişkilendirildikten sonra, ilişkili denetime veri girildiğinde WPF bunu otomatik olarak uygular. Bir denetim geçersiz veri içerdiğinde WPF, aşağıdaki şekilde gösterildiği gibi geçersiz denetimin çevresinde kırmızı bir kenarlık görüntüler.

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

WPF, geçerli veriler girene kadar kullanıcıyı geçersiz denetimle kısıtlamaz. Bu, iletişim kutusu için iyi bir davranıştır; bir kullanıcının, verilerin geçerli olup olmadığına bakılmaksızın iletişim kutusundaki denetimlerde serbestçe gezinebilmesi gerekir. Ancak bu, kullanıcının geçersiz veri girebileceği ve Tamam düğmesine basabileceği anlamına gelir. Bu nedenle, olayı işleyerek Click Tamam düğmesine basıldığında kodunuzun iletişim kutusundaki tüm denetimleri de doğrulaması gerekir.

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

Bu kod bir penceredeki tüm bağımlılık nesnelerini numaralandırır ve varsa geçersizse (tarafından GetHasErrordöndürüldüğü gibi, geçersiz denetim odağı alır, IsValid yöntem döndürür falseve pencere geçersiz kabul edilir.

bir iletişim kutusu geçerli olduktan sonra güvenli bir şekilde kapanıp geri dönebilir. Dönüş işleminin bir parçası olarak, çağıran işleve bir sonuç döndürmesi gerekir.

Kalıcı iletişim kutusu sonucunu ayarlama

kullanarak ShowDialog bir iletişim kutusu açmak temelde bir yöntemi çağırmaya benzer: iletişim kutusunu ShowDialog kullanarak açan kod, dönene kadar ShowDialog bekler. DöndürdüğündeShowDialog, çağıran kodun, kullanıcının Tamam düğmesine mi yoksa İptal düğmesine mi bastığına bağlı olarak işlemeye devam etmek mi yoksa işlemeyi durdurmak mı gerektiğine karar verebilmesi gerekir. Bu kararı kolaylaştırmak için iletişim kutusunun yönteminden döndürülen bir Boolean değer olarak kullanıcının seçimini döndürmesi ShowDialog gerekir.

Tamam düğmesine tıklandığında döndürmelidir ShowDialogtrue. Bu, Tamam düğmesine tıklandığında iletişim kutusunun özelliği ayarlanarak DialogResult elde edilir.

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

özelliğinin ayarlanması, DialogResult pencerenin otomatik olarak kapanmasına da neden olur ve bu da açıkça çağrılma Closegereksinimini giderir.

İptal düğmesine tıklandığında, ShowDialog özelliğinin ayarlanmasını DialogResult da gerektiren değerini döndürmelidirfalse.

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

Bir düğmenin IsCancel özelliği olarak true ayarlandığında ve kullanıcı İptal düğmesine veya ESC tuşuna bastığında, DialogResult otomatik olarak olarak falseayarlanır. Aşağıdaki işaretleme, olayı işlemeye Click gerek kalmadan önceki kodla aynı etkiye sahiptir.

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

Bir kullanıcı başlık çubuğundaki Kapat düğmesine bastığında veya Sistem menüsünden Kapat menü öğesini seçtiğinde iletişim kutusu otomatik olarak geri dönerfalse.

Kalıcı iletişim kutusundan döndürülen verileri işleme

DialogResult bir iletişim kutusu tarafından ayarlandığında, onu açan işlev döndürdüğünde ShowDialog özelliğini inceleyerek DialogResult iletişim kutusu sonucunu alabilir.

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

İletişim kutusu sonucu ise true, işlev bunu kullanıcı tarafından sağlanan verileri almak ve işlemek için ipucu olarak kullanır.

Dekont

Döndürüldükten sonra ShowDialog , bir iletişim kutusu yeniden açılamaz. Bunun yerine yeni bir örnek oluşturmanız gerekir.

İletişim kutusu sonucu ise false, işlevin işlemeyi uygun şekilde sonlandırması gerekir.

Modsuz özel iletişim kutusu oluşturma

Aşağıdaki şekilde gösterilen Bul İletişim Kutusu gibi modsuz bir iletişim kutusu, kalıcı iletişim kutusuyla aynı temel görünüme sahiptir.

Screenshot that shows a Find dialog box.

Ancak, aşağıdaki bölümlerde açıklandığı gibi davranış biraz farklıdır.

Modsuz iletişim kutusu açma

yöntemi çağrılarak Show modsuz bir iletişim kutusu açılır.

<!--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

aksine ShowDialog, Show hemen döndürür. Sonuç olarak, arama penceresi, modsuz iletişim kutusunun ne zaman kapatılıp kapatılmadığını belirleyemez ve bu nedenle, bir iletişim kutusu sonucunun ne zaman denetlendiğini veya daha fazla işlem için iletişim kutusundan veri alındığını bilmez. Bunun yerine, iletişim kutusunun işleme için arama penceresine veri döndürmek için alternatif bir yol oluşturması gerekir.

Modeless iletişim kutusundan döndürülen verileri işleme

Bu örnekte, FindDialogBox belirli bir sıklık olmadan aranmakta olan metne bağlı olarak, ana pencereye bir veya daha fazla bulma sonucu döndürebilir. Kalıcı iletişim kutusunda olduğu gibi, modsuz bir iletişim kutusu da özellikleri kullanarak sonuçları döndürebilir. Ancak, iletişim kutusunun sahibi olan pencerenin bu özelliklerin ne zaman denetlendiğini bilmesi gerekir. Bunu etkinleştirmenin bir yolu, iletişim kutusunun her metin bulunduğunda tetiklenen bir olayı uygulamasıdır. FindDialogBoxTextFoundEvent, önce bir temsilci gerektiren bu amaç için uygular.

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

Temsilcisini TextFoundEventHandler kullanarak, FindDialogBox uygular 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

Sonuç olarak, Find bir arama sonucu bulunduğunda olayı tetikleyebilir.

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

Ardından sahip penceresinin bu olaya kaydolması ve bu olayı işlemesi gerekir.

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

Modsuz iletişim kutusunu kapatma

DialogResult Ayarlanması gerekmediğinden, aşağıdakiler de dahil olmak üzere sistem sağlama mekanizmaları kullanılarak modsuz bir iletişim kutusu kapatılabilir:

  • Başlık çubuğunda Kapat düğmesine tıklayın.

  • ALT+F4 tuşlarına basın.

  • Sistem menüsünden Kapat'ı seçin.

Alternatif olarak, Kapat düğmesine tıklandığında kodunuz çağrı Close yapabilir.

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

Ayrıca bkz.