WPF में मोडल संवाद कैसे करें?


133

मैं अपना पहला आवेदन डब्ल्यूपीएफ में लिख रहा हूं और चाहता हूं कि उपयोगकर्ता इनपुट कुछ मोडल डायलॉग विंडो पर दे। जाहिरा तौर पर, यह WPF में करने के लिए सरल नहीं है, क्योंकि मूल विंडो पूरी तरह से सक्षम रहती है, और जिस विधि से नई चाइल्ड विंडो बनाई गई है वह बंद नहीं होती है और चाइल्ड विंडो को क्लोज () कॉल करने की प्रतीक्षा करता है। इसके बजाय यह सिर्फ आगे बढ़ता रहता है। यह वह नहीं है जिसकी मुझे चाहत है।

मैं बच्चे की खिड़की को कैसे खोल सकता हूं, और क्या माता-पिता की खिड़की बच्चे की प्रतीक्षा कर रही है, इससे पहले कि माता-पिता खिड़की को निष्पादित करना जारी रखें?


यहाँ से मेरे उत्तर को साझा करना क्योंकि यह किसी को Google से यहाँ भटकने में मदद कर सकता है।
शाहीन दोहान

जवाबों:


222

क्या आपने ShowDialog पद्धति का उपयोग करके अपनी विंडो दिखाने की कोशिश की ?

डायलॉग विंडो पर ओनर प्रॉपर्टी को मुख्य विंडो पर सेट करना न भूलें । यह अजीब व्यवहार से बच जाएगा जब Alt + Tabbing, आदि।


43

इनमें से बहुत सारे उत्तर सरल हैं, और यदि कोई व्यक्ति WPF की शुरुआत कर रहा है, तो हो सकता है कि वे सभी "ins-and-outs" को नहीं जानते हों, क्योंकि यह किसी को "उपयोग .ShowDialog()!" बताने की तुलना में अधिक जटिल है । लेकिन यह वह विधि है (नहीं .Show()) जो आप अंतर्निहित विंडो का उपयोग ब्लॉक करने के लिए और कोड को चालू रखने के लिए उपयोग करना चाहते हैं जब तक कि मोडल विंडो बंद न हो जाए।

सबसे पहले, आपको 2 WPF विंडो की आवश्यकता है। (एक दूसरे को बुला रहा होगा।)

पहली विंडो से, मान लीजिए कि इसे MainWindow.xaml कहा जाता है, इसके कोड में पीछे होगा:

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

फिर अपने XAML में अपना बटन जोड़ें:

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

और Clickदिनचर्या पर राइट-क्लिक करें , "गो टू डेफिनिशन" चुनें। यह MainWindow.xaml.cs में आपके लिए इसे बनाएगा:

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

उस फ़ंक्शन के भीतर, आपको उसके पृष्ठ वर्ग का उपयोग करके दूसरे पृष्ठ को निर्दिष्ट करना होगा। मान लें कि आपने उस दूसरे पृष्ठ का नाम "ModalWindow" रखा है, ताकि वह उसका पृष्ठ वर्ग बन जाए और यह है कि आप उसे कैसे कॉल (कॉल) करेंगे:

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

मान लें कि आपके पास अपने मोडल डायलॉग पर सेट की गई वैल्यू है। ModalWindowXAML में एक टेक्स्टबॉक्स और एक बटन बनाएँ :

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

फिर एक ईवेंट हैंडलर (दूसरा Clickईवेंट) बनाएं और टेक्स्टबॉक्स मान को सार्वजनिक स्थैतिक चर पर ModalWindowऔर कॉल पर सहेजने के लिए इसका उपयोग करें 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();
    }
}

फिर, अपने .ShowDialog()बयान के बाद , आप उस मूल्य को पकड़ सकते हैं और उसका उपयोग कर सकते हैं:

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

    string valueFromModalTextBox = ModalWindow.myValue;
}

29

Window.Show विंडो विंडो दिखाएगा, और निष्पादन जारी रखेगा - यह एक गैर-अवरोधक कॉल है।

Window.ShowDialog कॉलिंग थ्रेड (थोड़े [1]) को ब्लॉक करेगा, और डायलॉग दिखाएगा। यह अभिभावक / मालिक खिड़की के साथ बातचीत को भी अवरुद्ध करेगा। जब संवाद खारिज किया जाता है (forwhatever reason) तो ShowDialog कॉलर को वापस कर देगा, और आपको DialogResult (यदि आप इसे चाहते हैं) का उपयोग करने की अनुमति देगा।

[१] यह डिस्पैचर पंपिंग को WPF डिपैचर पर एक डिस्पैचर फ्रेम को पुश करके रखेगा। यह संदेश पंप को पंप रखने का कारण बनेगा।


कृपया इसे और अधिक विस्तार से बताएं? मैं एक ऐसी ही समस्या को देख रहा हूं, जहां मेरे पास एक परीक्षण प्रक्रिया चल रही है, लेकिन चेतावनी संदेश मोडल संवादों के रूप में पॉप अप कर सकते हैं, लेकिन मैं निष्पादन को अवरुद्ध नहीं करना चाहता।
फिरोजो

2

विंडो ऑब्जेक्ट myWindow, myWindow.Show () को देखते हुए इसे मॉडल रूप से और myWindow.ShowDialog () से खोलने पर यह मामूली रूप से खुल जाएगा। हालांकि, यहां तक ​​कि उत्तरार्द्ध भी ब्लॉक नहीं होता है, जो मुझे याद है।


6
मेरा मानना ​​है कि यह ब्लॉक होता है। MyWindow.Show () के बाद कोड myWindow कॉल बंद होने () के बाद तक निष्पादित नहीं हो रहा है।
एलेक्स बारानोस्की

आप और @AlexBaranosky दोनों सही हैं: ShowDialogजब तक मोडल बंद नहीं होता है, तब तक यह वापस नहीं आता है, इसलिए यह वर्तमान में निष्पादित डिस्पैचर ऑपरेशन को अवरुद्ध करता है। लेकिन ShowDialogस्वयं प्रभावी ढंग से कॉल करता है Dispatcher.Run(), इसलिए डिस्पैचर यूआई को उत्तरदायी रखते हुए, संचालन को जारी रखता है।
मैट थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.