WPF'de kalıcı iletişim kutusu nasıl yapılır?


133

İlk uygulamamı WPF'de yazıyorum ve kullanıcının kalıcı bir iletişim penceresinde bazı verileri girmesini istiyorum. Görünüşe göre, bu WPF'de yapmak kolay değildir, çünkü ana pencere tam olarak etkin kalır ve yeni alt pencereyi oluşturan yöntem durmaz ve alt pencerenin Close () 'u çağırmasını beklemez. Bunun yerine ilerlemeye devam ediyor. İstediğim bu değil.

Alt pencerenin açılmasını nasıl sağlayabilirim ve ana pencere çalışmaya devam etmeden önce ana pencerenin çocuğun kapanmasını bekletmesini nasıl sağlayabilirim?


Cevabımı burada paylaşmak , Google'dan burada dolaşan birine yardımcı olabilir.
Shahin Dohan

Yanıtlar:



43

Bu yanıtların çoğu basittir ve eğer birisi WPF'ye başlıyorsa, "Kullanın .ShowDialog()!" Ancak .Show(), temeldeki pencerenin kullanımını engellemek ve kodun kalıcı pencere kapatılana kadar devam etmesini önlemek için kullanmak istediğiniz yöntem budur (değil ).

Öncelikle 2 WPF penceresine ihtiyacınız var. (Biri diğerini arayacak.)

İlk pencereden, bunun MainWindow.xaml olarak adlandırıldığını varsayalım, arka plan kodunda:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

Ardından düğmenizi XAML'nize ekleyin:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

Ve Clickrutini sağ tıklayın, "Tanıma git" i seçin. Bunu sizin için MainWindow.xaml.cs içinde oluşturacaktır:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

Bu işlevde, diğer sayfayı kendi sayfa sınıfını kullanarak belirtmeniz gerekir. Diğer sayfayı "ModalWindow" olarak adlandırdığınızı varsayalım, bu onun sayfa sınıfı olur ve onu nasıl başlatırsınız (çağırırsınız):

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}

Kalıcı iletişim kutusunda ayarlamanız gereken bir değer olduğunu varsayalım. XAML'de bir metin kutusu ve düğme oluşturun ModalWindow:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

Sonra Clicktekrar bir olay işleyicisi (başka bir olay) oluşturun ve metin kutusu değerini açık bir statik değişkene kaydetmek ModalWindowve çağırmak için kullanın this.Close().

public partial class ModalWindow : Window
{
    public static string myValue = String.Empty;        
    public ModalWindow()
    {
        InitializeComponent();
    }

    private void btnSaveData_Click(object sender, RoutedEventArgs e)
    {
        myValue = txtSomeBox.Text;
        this.Close();
    }
}

Ardından, ifadenizin ardından .ShowDialog()bu değeri kavrayabilir ve kullanabilirsiniz:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

29

Window.Show Window, pencereyi gösterecek ve yürütmeye devam edecektir - bu, engellemeyen bir çağrıdır.

Window.ShowDialog, çağıran evreyi ([1] türü) bloke edecek ve diyaloğu gösterecektir. Ayrıca, ebeveyn / sahiplik penceresi ile etkileşimi de engeller. Diyalog kapatıldığında (her ne sebeple olursa olsun) ShowDialog arayana geri dönecek ve DialogResult'a erişmenize izin verecektir (eğer isterseniz).

[1] Bir dağıtıcı çerçevesini WPF dağıtıcıya iterek dağıtıcının pompalamasını sürdürecektir. Bu, mesaj pompasının pompalamaya devam etmesine neden olacaktır.


bunu daha detaylı açıklar mısınız lütfen? Çalışmakta olan bir test sürecim olduğu benzer bir soruna bakıyorum, ancak uyarı mesajları kalıcı iletişim kutuları olarak açılabilir ancak yürütmeyi engellemek istemiyorum.
Firoso

2

MyWindow bir Pencere nesnesi verildiğinde, myWindow.Show () onu modelsiz açacak ve myWindow.ShowDialog () onu modsal olarak açacaktır. Ancak, ikincisi bile hatırladığımı engellemiyor.


6
Engellediğine inanıyorum. MyWindow.Show () 'dan sonraki kod, myWindow Close ()' u çağırıncaya kadar yürütülmez.
Alex Baranosky

Hem siz hem de @AlexBaranosky haklısınız: ShowDialogmodal kapanana kadar geri dönmez, bu nedenle o anda yürütülen dağıtım programı işlemini engeller. Ancak ShowDialogkendisi etkili bir şekilde çağırır Dispatcher.Run(), böylece dağıtıcı işlemleri yürütmeye devam eder ve aslında kullanıcı arayüzünü duyarlı tutar.
Matt Thomas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.