Aracılığıyla paylaş


İletişim Kutularına Genel Bakış

Tek başına çalışan uygulamaları, genellikle her ikisini de görüntüler üzerinden uygulama çalışır ve veriyi işlemek için işlevsellik ana veri bir ana pencere sahip user interface (UI) mekanizmaları gibi menü çubukları, araç çubukları ve durum çubukları. Önemsiz olmayan bir uygulama aşağıdakileri yapmak için ek pencereler da görüntüleyebilirsiniz:

  • Kullanıcılar için özel bilgileri görüntüleyin.

  • Kullanıcılardan bilgi toplamak.

  • Hem görüntüleme hem de bilgi toplayabilir.

Windows bu tür olarak bilinen iletişim kutuları, ve iki türü vardır: kalıcı ve kalıcı olmayan.

A modal işlevini devam etmek için bir kullanıcıdan ek veriler gerektiğinde iletişim kutusu işlevi kullanılarak görüntülenir. Veri toplamak için kalıcı bir iletişim kutusu işlevi bağlı olduğundan, kalıcı iletişim kutusu açık kalırken uygulamadaki diğer windows etkinleştirme bir kullanıcının da engeller. Çoğu durumda, bunlar ile kalıcı bir iletişim kutusu ya da basarak bitirdiğinizde sinyal kullanıcının kalıcı bir iletişim kutusu sağlar bir Tamam veya İptal düğme. Tuşuna basarak Tamam düğmesi, kullanıcı veri girmiştir ve işlevi veri işleme devam etmek istediğini gösterir. Tuşuna basarak İptal düğmesi kullanıcı işlevi tamamen yürütülmesini durdurmak istediğini gösterir. Kalıcı iletişim kutusu en yaygın örnekleri açın, kaydedin ve veri yazdırmak için gösterilir.

A geçici iletişim kutusunda, diğer taraftan değil önlemek kullanıcı açık iken diğer windows etkinleştirme. Örneğin, bir kullanıcı bir belgede belirli bir sözcüğün geçtiği bulmak istiyorsa, ana pencere çoğunlukla onlar aradığınız ne word kullanıcı istemek üzere bir iletişim kutusu açılır. Beri bulma bir word belgesi düzenleme kullanıcı engellemez, ancak iletişim kutusu kalıcı olması gerekmez. En az bir kalıcı olmayan bir iletişim kutusu sağlar bir kapatmak iletişim kutusunu kapatmak için düğme ve belirli işlevleri gibi yürütmek için ek düğmeleri sağlayabilir bir Sonrakini Bul sözcük arama bulma ölçütü ile eşleşen sonraki sözcüğü Bul düğmesi.

Windows Presentation Foundation (WPF)ileti kutuları, ortak iletişim kutusu ve özel iletişim kutuları gibi iletişim kutuları, çeşitli türlerde oluşturmanıza olanak tanır. Bu konuda her, ele alınmaktadır ve İletişim kutusunu örnek eşleşen örnekler sağlar.

Bu konu aşağıdaki bölümleri içerir.

  • İleti kutuları
  • Ortak iletişim kutusu
  • Özel iletişim kutuları
  • İlgili Konular

İleti kutuları

A ileti kutusu kararlar düğmeleri ile kullanıcılara izin veren ve metinsel bilgileri görüntülemek için kullanılan bir iletişim kutusudur. Aşağıdaki şekil, metin bilgilerini görüntüler, soru soran ve soruyu yanıtlamak için üç düğme kullanıcı sağlar bir ileti kutusu gösterilir.

Sözcük İşlemci iletişim kutusu

Bir ileti kutusu oluşturmak için kullandığınız MessageBox sınıfa MessageBoxileti kutusunda metni, başlık, simge ve düğmeler, aşağıdaki gibi bir kod kullanarak yapılandırmanızı sağlar.

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

Bir ileti kutusu görüntülemek için arama static Show yöntemi olarak demonstrated aşağıdaki kodu.

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

Bir ileti kutusu gösterilir kodu algılar ve kullanıcının karar (hangi düğmesine basılı) işlemek gerektiğinde, ileti kutusu sonucu aşağıdaki kodda gösterildiği gibi kodu inceleyebilirsiniz.

' 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
// 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;
}

İleti kutularını kullanma hakkında daha fazla bilgi için bkz: MessageBox, MessageBox örnek, ve iletişim kutusunu örnek.

Ancak MessageBox sunan bir basit iletişim kutusunu kullanıcı deneyimi, kullanmanın avantajı MessageBox kısmi güven güvenlik sanal alanı içinde çalışan uygulamalar tarafından gösterilen pencere türü ise (bkz: Güvenlik (WPF)), gibi XAML browser applications (XBAPs).

Çoğu iletişim kutusu görüntülemek ve metin, seçimi (onay kutuları) dışlayan seçimi (radyo düğmeleri) dahil olmak üzere bir ileti kutusu sonucu çok daha karmaşık veri toplamak ve seçimi (liste kutuları, birleşik giriş kutularının, açılan liste kutuları) listeler. Bu, Windows Presentation Foundation (WPF) ya da kullanımı uygulamaları çalıştıran tam güven ile sınırlı olsa da kendi iletişim kutuları oluşturmanıza olanak verir ve birçok ortak iletişim kutusu sağlar

Ortak iletişim kutusu

Windowsdosyaları kaydetme ve yazdırma dosyaları açma, iletişim kutuları da dahil olmak üzere tüm uygulamalar için ortak olan yeniden kullanılabilir iletişim kutuları çeşitli uygular. Bu iletişim kutuları işletim sistemi tarafından uygulanan beri kullanıcı deneyimini tutarlılık yardımcı olan işletim sistemi üzerinde çalışan tüm uygulamalar arasında paylaşılabilir; Kullanıcı bir uygulamadaki bir işletim sistemi tarafından sağlanan iletişim kutusunun kullanılması hakkında bilgi sahibi olduğunda, diğer uygulamalar bu iletişim kutusunda kullanmayı öğrenmek gerekmez. Çünkü tüm uygulamalar bu iletişim kutularında kullanılabilir ve bunlar tutarlı bir kullanıcı deneyimi sağlamak için bunların olarak bilinen ortak iletişim kutularının.

Windows Presentation Foundation (WPF)Dosya ve yazdırma ortak iletişim kutularının kaydetme açık dosyayı Kapsüller ve olarak yönetilen sınıflar, tek başına uygulamalarında kullanabileceğiniz kullanıma sunar. Bu konuda her kısa bir genel bakış sağlar.

Dosya Aç iletişim kutusu

Dosyasını Aç iletişim kutusunda aşağıdaki şekilde gösterilen işlevini açma dosyası açmak için dosyanın adını almak için kullanılır.

Aç iletişim kutusu

Ortak bir dosya Aç iletişim kutusu olarak uygulanan OpenFileDialog sınıf ve içinde bulunduğu Microsoft.Win32 ad. Aşağıdaki kod, oluşturmak, yapılandırmak ve bir göstermek ve sonuç işlemek nasıl gösterir.

' 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
// 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;
}

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

NotNot

OpenFileDialoggüvenli dosya adları almak için kısmi güven ile çalışan uygulamalar tarafından kullanılabilir (bkz: Güvenlik (WPF)).

Dosya iletişim kutusunda Kaydet

Kayıt dosyası iletişim kutusunda, aşağıdaki şekilde gösterildiği işlevselliği kaydetme dosya kaydetmek için dosya adını almak için kullanılır.

Farklı Kaydet iletişim kutusu

Save file iletişim kutusu yaygın olarak uygulanan SaveFileDialog sınıf ve içinde bulunduğu Microsoft.Win32 ad. Aşağıdaki kod, oluşturmak, yapılandırmak ve bir göstermek ve sonuç işlemek nasıl gösterir.

' Configure save file dialog box
Dim dlg As New Microsoft.Win32.SaveFileDialog()
dlg.FileName = "Document" ' Default file name
dlg.DefaultExt = ".text" ' 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
// Configure save file dialog box
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".text"; // 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;
}

Kaydetme hakkında daha fazla bilgi için dosya iletişim kutusu, bkz: Microsoft.Win32.SaveFileDialog.

Yazdır iletişim kutusu

Aşağıdaki şekilde gösterildiği Yazdır iletişim kutusunda yazdırma işlevine göre seçin ve kullanıcı verilerini yazdırmak istediğiniz yazıcıyı yapılandırmak için kullanılır.

Yazdır iletişim kutusu

Yaygın yazdırma iletişim kutusu olarak uygulanan PrintDialog sınıf ve içinde bulunduğu System.Windows.Controls ad. Aşağıdaki kod, oluşturmak, yapılandırmak ve bir show gösterilmiştir.

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

Yazdır iletişim kutusu hakkında daha fazla bilgi için bkz: System.Windows.Controls.PrintDialog. Baskı ayrıntılı tartışma için WPFbakın Yazdırmaya Genel Bakış.

Özel iletişim kutuları

Ortak iletişim kutuları kullanışlıdır ve mümkün olduğunda kullanılmalıdır, ancak etki alanına özgü iletişim kutularını gereksinimlerini desteklemez. Bu gibi durumlarda, kendi iletişim kutuları oluşturmak gerekir. Göreceğimiz gibi bir iletişim kutusu özel davranışlar ile bir penceredir. WindowBu davranışları uygular ve sonuç olarak, Window oluşturma özel kalıcı ve kalıcı olmayan iletişim kutuları.

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

Bu konuda nasıl kullanılacağını gösterir Window tipik bir kalıcı iletişim kutusu uygulama oluşturmak için kullanarak Margins örnek olarak iletişim kutusunu (bkz: İletişim kutusunu örnek). Margins İletişim kutusu olarak gösterilir aşağıdaki şekil.

Kenar Boşlukları iletişim kutusu

Kalıcı bir iletişim kutusu yapılandırma

Normal iletişim kutusu için kullanıcı arabirimi aşağıdakileri içerir:

  • İstenen veri toplamak için gerekli olan çeşitli kontrol eder.

  • Gösteren bir Tamam kullanıcıları, işlevin dönüş iletişim kutusunu kapatmak için tıklatın ve işleme devam düğmesini.

  • Gösteren bir İptal kullanıcılar'ı tıklatın iletişim kutusunu kapatın ve işlevini daha iyi işlemesini durdurmak için düğme.

  • Gösteren bir Kapat başlık çubuğundaki düğmesini.

  • Simge gösteriliyor.

  • Gösteren Minimize, Ekranı Kapla, ve geri düğmeleri.

  • Gösteren bir Sistem en aza indirmek, en üst düzeye çıkarmak, geri yükleme ve iletişim kutusunu kapatmak için menü.

  • Yukarıda ve iletişim kutusu açık pencerenin ortasına açılıyor.

  • İletişim kutuları mümkün olduğunca iletişim kutusu çok küçük önlemek ve yararlı varsayılan boyutta kullanıcı sağlamak için varsayılan ve en az ayarlamanız gerekecek şekilde yeniden boyutlandırılabilir boyutları sırasıyla olmalıdır.

  • esc tuşuna basarak yapılandırılmış neden olan bir klavye kısayolu olarak İptal düğmesine basınız. Bu ayarlayarak sağlanır IsCancel özelliği İptal için true.

  • enter (veya return) tuşuna basarak yapılandırılmış neden olan bir klavye kısayolu olarak Tamam düğmesine basınız. Bu ayarlayarak sağlanır IsDefault özelliği Tamam düğmesini true.

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


<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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>
Imports System.Windows ' Window, RoutedEventArgs, IInputElement, DependencyObject
Imports System.Windows.Controls ' Validation
Imports System.Windows.Input ' Keyboard

Namespace SDKSample


Public Class MarginsDialogBox
    Inherits Window
    Public Sub New()
        Me.InitializeComponent()
    End Sub


...


End Class

End Namespace
using System.Windows; // Window, RoutedEventArgs, IInputElement, DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {
        public MarginsDialogBox()
        {
            InitializeComponent();
        }


...


    }
}

Bir iletişim kutusu kullanıcı deneyimini de iletişim kutusu açılır pencerenin menü çubuğuna genişletir. Bir menü öğesini işlevini devam etmeden önce bir iletişim kutusu aracılığıyla kullanıcı etkileşimi gerektiren bir işlev çalıştırıldığında işlev için menü öğesi üç nokta başlığında, aşağıda gösterildiği gibi olacaktır.

<!--Main Window-->


...


<MenuItem Name="formatMarginsMenuItem" Header="_Margins..." Click="formatMarginsMenuItem_Click" />

Bir 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ırıldığında üç nokta gerekli değildir.

Bir kalıcı iletişim kutusunu açma

Bir iletişim kutusu genellikle bir kullanıcı bir menü öğesini seçerek bir sonucu olarak bir sözcük işlemcide belgenin kenar boşluklarını ayarlama gibi bir özel etki alanı işlevi gerçekleştirmek için görünür. Ek iletişim kutusunda özel yapılandırması gerektirse de gösteren bir iletişim kutusu gibi bir pencereyi normal bir pencere gösterecek şekilde benzer. Başlatmasını tüm işlemi, yapılandırma ve iletişim kutusunu açıp aşağıdaki kodu gösterilir.


Imports System '  EventArgs
Imports System.ComponentModel '  CancelEventArgs
Imports System.Windows '  Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls '  TextChangedEventArgs
Imports Microsoft.Win32 '  OpenFileDialog

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
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextChangedEventArgs
using Microsoft.Win32; // OpenFileDialog

namespace SDKSample
{
    public partial class MainWindow : Window
    {


...


        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();



...


}


...


    }
}

Burada, kod varsayılan bilgileri (geçerli kenar boşluğu) iletişim kutusuna geçiyor. Ayrıca ayarlama Window.Owner özelliği ile başvuru penceresinde, gösteren iletişim kutusu. Genel olarak, her zaman tüm iletişim kutuları için ortak olan pencere durumu ile ilgili davranışları sağlamak için bir iletişim kutusu sahibi ayarlamanız gerekir (bkz: WPF Windows Genel Bakış daha fazla bilgi için).

NotNot

Desteklemek için sahibi sağlamalıdır user interface (UI) iletişim kutuları için Otomasyon (bkz: UI Otomasyon genel bakış).

İletişim kutusu yapılandırıldıktan sonra kalıcı olarak çağırarak gösterilen ShowDialog yöntemi.

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

Bir iletişim kutusu açılır ve kullanıcı gerekli verileri sağlayan bir iletişim kutusu aşağıdaki nedenlerle sağlanan verilerin geçerli olduğunu sağlamak için sorumludur:

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

  • Etki alanına özgü açısından bakıldığında, hatalı veri özel durum oluşturabilir kod tarafından işlenen veri doğrulama engel olur.

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

  • Performans açısından bakıldığında, özellikle uygulamanın Web Hizmetleri veya sunucu tabanlı veritabanları oluşan durumsa istemci uygulama katmanları arasında sayısı çok katmanlı bir uygulama veri doğrulama küçültebilirsiniz.

İlişkili bir denetim doğrulamak için WPF, geçerlilik kuralı tanımlamak ve bağlama ile ilişkilendirmek için gereksinim duyduğunuz. Geçerlilik kuralı türetildiği özel bir sınıf olan ValidationRule. Geçerlilik kuralı, aşağıdaki örnekte gösterildiği MarginValidationRule, ilişkili değer hangi denetimleri bir Double ve içinde belirtilen bir aralık.

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
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);
        }
    }
}

Bu kodda, bir geçerlilik kuralı doğrulama mantığını geçersiz kılarak uygulanan Validate yöntemi, veri doğrulama ve uygun bir sayı ValidationResult.

Geçerlilik kuralı bağlı denetimle ilişkilendirmek için aşağıdaki biçimlendirme kullanın.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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>
    


...


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


...


</Window>

Geçerlilik kuralı ilişkilendirildiği bir kez WPF otomatik olarak uygulanır, veri ilişkili denetim girildiğinde Bir denetime geçersiz veri içeriyorsa WPF görüntüler geçersiz denetim kırmızı etrafındaki gibi gösterildiği aşağıdaki şekil.

Geçersiz sol kenar boşluğu

WPFGeçerli veri girmiş olduğunuz kadar kullanıcı geçersiz denetim kısıtlamaz. Bu iletişim kutusu için iyi davranıştır; bir kullanıcı bir iletişim kutusu denetimleri veri geçerli olup olmadığını özgürce gidin görebilmeniz gerekir. Ancak, kullanıcı geçersiz veri ve basın girebilirsiniz yani Tamam düğme. Bu nedenle, kodunuzu de bir iletişim kutusunda tüm denetimleri doğrulamak gerekir ne zaman kutusunda Tamam tarafından işleme düğmesinin basılı Click olay.

Imports System.Windows ' Window, RoutedEventArgs, IInputElement, DependencyObject
Imports System.Windows.Controls ' Validation
Imports System.Windows.Input ' Keyboard

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
using System.Windows; // Window, RoutedEventArgs, IInputElement, DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard

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

Bu kod bir pencere tüm bağımlı nesnelerde numaralandırır ve geçersiz olduğunda (tarafından iade olarak GetHasError, geçersiz denetim odağı alır IsValid yöntemi döndürür false, ve pencere geçersiz. kabul edilir

Bir iletişim kutusu geçerli olduğu güvenle kapatmak dönmek ve. İade işleminin bir parçası olarak, onu çağıran işleve bir sonuca dönmek gerekiyor.

Bir iletişim kutusu kullanarak açma ShowDialog bir yöntemi çağırmak gibi temelde olan: Açılan iletişim kutusunu kullanarak kod ShowDialog bekler ShowDialog döndürür. Zaman ShowDialog döndürür, işleme devam etmek, durdurmak için olup göre mi karar ihtiyaçlarını çağıran kodun kullanıcı basılı Tamam düğmesini veya İptal düğme. Bu kararı kolaylaştırmak için iletişim kutusu kullanıcının seçim olarak döndürmesi gerekir bir Boolean dönen değeri ShowDialog yöntemi.

Zaman Tamam , düğmeyi ShowDialog dönmek true. Bu ayarlayarak sağlanır DialogResult özelliği iletişim kutusunda Tamam düğmesi tıklatıldığında.

Not Bu ayarı DialogResult özelliği de neden otomatik olarak kapatmak pencerenin çaðýrmak için gereğini azaltır Close.

Zaman İptal düğmesi tıklatıldığında, ShowDialog dönmek false, ayrıca gerektiren ayarı, DialogResult özelliği.

Imports System.Windows ' Window, RoutedEventArgs, IInputElement, DependencyObject
Imports System.Windows.Controls ' Validation
Imports System.Windows.Input ' Keyboard

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
using System.Windows; // Window, RoutedEventArgs, IInputElement, DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard

namespace SDKSample
{
    public partial class MarginsDialogBox : Window
    {


...


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


...


    }
}

Bir düğmeyi tıklattığınızda 's IsCancel özelliği ayarlanmış true ve kullanıcı ya da İptal düğmesini veya esc tuşunu DialogResult otomatik olarak ayarlanır false. Aşağıdaki biçimlendirme işlemeye gerek kalmadan önceki kod olarak aynı etkiyi Click olay.

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

Bir iletişim kutusu otomatik olarak döndürür false bir kullanıcı basar Kapat başlık çubuğunda düğmesini tıklatın veya seçer Kapat menü öğesinden Sistem menü.

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

Zaman DialogResult ayarlanır iletişim kutusu tarafından açılmış işlevi iletişim kutusu sonucu inceleyerek edinebilirsiniz DialogResult özelliği, ShowDialog döndürür.


Imports System '  EventArgs
Imports System.ComponentModel '  CancelEventArgs
Imports System.Windows '  Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls '  TextChangedEventArgs
Imports Microsoft.Win32 '  OpenFileDialog

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
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextChangedEventArgs
using Microsoft.Win32; // OpenFileDialog

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


...


    }
}

İletişim sonucu ise true, işlev, almak ve tarafından sağlanan verileri işlemek için bir işaret olarak kullanırkullanıcının.

NotNot

Sonra ShowDialog döndürdü, bir iletişim kutusu yapamazsınız yeniden.Bunun yerine, yeni bir örneğini oluşturmak gerekir.

İletişim sonucu ise false, uygun bir şekilde işleme işlevi sona ermelidir.

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

Bir kalıcı olmayan bir iletişim kutusu Bul iletişim kutusu aşağıdaki şekilde gösterildiği gibi kalıcı iletişim kutusu olarak aynı temel görünüme sahiptir.

Bul iletişim kutusu

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

Kalıcı olmayan bir iletişim kutusunu açma

Çağırarak bir kalıcı olmayan bir iletişim kutusu açıldığında Show yöntemi.

<!--Main Window-->

Imports System '  EventArgs
Imports System.ComponentModel '  CancelEventArgs
Imports System.Windows '  Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls '  TextChangedEventArgs
Imports Microsoft.Win32 '  OpenFileDialog

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
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextChangedEventArgs
using Microsoft.Win32; // OpenFileDialog

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();
}


...


    }
}

Aksine ShowDialog, Show hemen döner. Sonuç olarak, kalıcı olmayan bir iletişim kutusu kapatılır ve bu nedenle, bir iletişim kutusu sonuç için denetlemek veya sonradan işlenmek üzere iletişim kutusundan veri almak ne zaman sahibi değildir, arama penceresini bilemezler. Bunun yerine, iletişim kutusunda veri işleme için arama penceresine dönmek için alternatif bir yol oluşturması gerekiyor.

Kalıcı olmayan bir iletişim kutusundan döndürülen veri işleme

Bu örnekte, FindDialogBox bir veya daha fazla ana penceresinde, metin arama için belirli bir frekans herhangi bağlı sonuçları Bul döndürebilir Bir kalıcı iletişim kutusu gibi kalıcı olmayan bir iletişim kutusunu özellikleri kullanarak sonuçları dönebilirsiniz. Ancak, iletişim kutusunun sahibi olan pencere ne zaman bu özellikleri denetlemek bilmesi gerekir. Bunu etkinleştirmek için bir iletişim kutusunda bulunan metin olduğunda ortaya çıkar olaya uygulamak yoludur. FindDialogBoxuygulayan TextFoundEvent Bu amaçla öncelikle gerektiren bir temsilci.

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

Kullanarak TextFoundEventHandler temsilci, FindDialogBox uygulayan TextFoundEvent.

Imports System ' EventArgs
Imports System.Windows ' Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls ' TextBox, TextChangedEventArgs
Imports System.Text.RegularExpressions ' Regex

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
using System; // EventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextBox, TextChangedEventArgs
using System.Text.RegularExpressions; // Regex

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);
        }


...


    }
}

Sonuç olarak, Find arama sonucu bulunduğunda olay yükseltebilirsiniz.

Imports System ' EventArgs
Imports System.Windows ' Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls ' TextBox, TextChangedEventArgs
Imports System.Text.RegularExpressions ' Regex

Namespace SDKSample

Public Class FindDialogBox
    Inherits Window


...


Private Sub findNextButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)


...


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


...


End Sub


...


End Class

End Namespace
using System; // EventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextBox, TextChangedEventArgs
using System.Text.RegularExpressions; // Regex

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();


...


}


...


    }
}

Sahip pencereyi sonra kayıt yaptırmak ve bu olay işlemesi gerekiyor.


Imports System '  EventArgs
Imports System.ComponentModel '  CancelEventArgs
Imports System.Windows '  Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls '  TextChangedEventArgs
Imports Microsoft.Win32 '  OpenFileDialog

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
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextChangedEventArgs
using Microsoft.Win32; // OpenFileDialog

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();
        }
    }
}

Kalıcı olmayan bir iletişim kutusunu kapatma

Çünkü DialogResult , kalıcı olmayan bir iletişim kapalı sistemini kullanarak, ayarlanmış olması gerekli değil aşağıdakileri içeren mekanizmalar:

  • Tıklatarak Kapat başlık çubuğundaki düğmesini.

  • alt + F4 tuşlarına basıp.

  • Seçme Kapat dan Sistem menü.

Alternatif olarak, kodunuzu çağırabilir Close , Kapat düğmesi tıklatıldığında.

Imports System ' EventArgs
Imports System.Windows ' Window, MessageBoxXxx, RoutedEventArgs
Imports System.Windows.Controls ' TextBox, TextChangedEventArgs
Imports System.Text.RegularExpressions ' Regex

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
using System; // EventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
using System.Windows.Controls; // TextBox, TextChangedEventArgs
using System.Text.RegularExpressions; // Regex

namespace SDKSample
{
    public partial class FindDialogBox : Window
    {


...


        void closeButton_Click(object sender, RoutedEventArgs e)
        {
            // Close dialog box
            this.Close();
        }
    }
}

Ayrıca bkz.

Kavramlar

Popup Genel Bakış

Diğer Kaynaklar

İletişim kutusunun örnek

ColorPicker özel denetim örnek