2009-01-31 15 views
104

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

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

उत्तर

187

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

मुख्य विंडो पर संवाद खिड़की पर Owner property सेट करने के लिए मत भूलना। Alt + Tabbing, आदि

+2

मैं, सीख रहा हूँ hehe ... बहुत अच्छा, धन्यवाद मत भूलना –

+74

स्थापित करने के लिए संवाद विंडो पर मालिक संपत्ति। अन्यथा, उपयोगकर्ता को अजीब व्यवहार मिलेगा जब Alt + Tabbing, आदि –

+3

@EdwardBrey गंभीर रूप से बड़ी पीईटी PEEVE –

2

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

+6

मुझे विश्वास है कि यह ब्लॉक करता है। MyWindow.Show() के बाद कोड मेरा विन्डोज़ कॉल बंद होने के बाद तक निष्पादित नहीं हो रहा है()। –

24

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

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

[1] यह WPF dipatcher पर एक डिस्पैचर फ्रेम धक्का द्वारा डिस्पैचर पंप रखेंगे। यह संदेश पंप पम्पिंग रखने के लिए कारण होगा।

+0

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

13

इनमें से बहुत से उत्तर सरल हैं, और यदि कोई डब्ल्यूपीएफ शुरू कर रहा है, तो वे सभी "इन-एंड-आउट" नहीं जानते हैं, क्योंकि यह किसी को ".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(); 
} 

आप आप अपने मॉडल संवाद पर सेट की जरूरत है एक मूल्य है कहो।ModalWindow XAML में एक पाठ बॉक्स और एक बटन बनाएँ:

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

यह काम नहीं करता है। आपके मॉडेलपेज को 'विंडो' का विस्तार करना चाहिए, न कि 'पृष्ठ'। –

+0

मेरे पास यह मेरे कोड में सही था। तुम सही हो। मैंने अपना जवाब अपडेट किया। मैं मूल रूप से अपने प्रोजेक्ट के वास्तविक कोड का एक स्वच्छता संस्करण प्रदान करने की कोशिश कर रहा था, इसलिए मुझे यह "ढांचा" काम पता है, लेकिन हाँ, मुझे 'विंडो' होना चाहिए था और नहीं। शायद उस सुबह मेरी कॉफी नहीं थी। – vapcguy

+1

अब ठीक है। एक सरल और कार्यात्मक उदाहरण। धन्यवाद। –

संबंधित मुद्दे