2009-06-12 11 views
17

क्या कोई इस तथ्य के लिए एक अच्छा स्पष्टीकरण के बारे में सोच सकता है कि एक संवाद के परिणाम डब्ल्यूपीएफ में एक बेकार बूल है? यह हमेशा मुझे परेशान करता है। WinForms में यह एक enum प्रकार था और यह मेरे लिए बहुत अधिक समझ में आया।डब्ल्यूपीएफ में डायलॉग रेसल्ट एक नालीबल बूल क्यों है?

उत्तर

5

मेरी राय में यह इसलिए किया गया क्योंकि ज्यादातर मामलों में आपको सामान्यीकृत विकल्प जैसे रीट्री या अनदेखा की आवश्यकता नहीं है।

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

यदि आपके पास एक ऐसा संवाद है जो केवल एक प्रश्न से अधिक है तो उपयोगकर्ता को जवाब देना चाहिए (उदा।एक प्रवेश प्रपत्र), आप आमतौर पर ठीक/रद्द के साथ बेहतर होते हैं, इसलिए आपको अधिक मूल्यों की आवश्यकता नहीं होती है।

+0

फिर क्यों न्यूलबल (बूलियन का), क्यों न केवल बूलियन, या थ्रीस्टेट? – Shimmy

+0

बूल? मेरी राय में, yaetr से संभालना आसान है (अभी तक याद रखने के लिए एक और enum)। और शून्य मान निश्चित रूप से सही/गलत मानों के विपरीत, बिना किसी असाइन किए गए मान के रूप में बाइंडिंग के लिए उपयोगी हो सकता है। बेशक, * मुझे नहीं पता * यह ऐसा क्यों है, बस अनुमान लगा रहा है :) – OregonGhost

2

the MSDN documentation के अनुसार:

DialogResult अशक्त जब संवाद बॉक्स दिखाया गया है लेकिन न तो स्वीकार कर लिया है और न ही रद्द किया जाता है।

लेकिन मुझे यकीन नहीं है कि यह तब तक कैसे हो सकता है जब तक आप संवाद तक पहुंचने वाले एकाधिक धागे से निपट नहीं रहे।

  • PressesALT + F4: जब निम्न चीजों में से एक हो

    प्रलेखन कहते हैं गलत है।

  • बंद करें बटन पर क्लिक करता है।
  • सिस्टम मेनू से बंद का चयन करता है।
+0

मुझे लगता है कि यह तब होता है जब उपयोगकर्ता विंडो के ऊपरी दाएं भाग पर बंद बटन पर क्लिक करता है। –

+0

मेरे द्वारा लिंक किए गए दस्तावेज के अनुसार नहीं ... मैं अधिक जानकारी के साथ संपादित करूंगा –

+0

@ मैक्स, अगर आप 'शो' कहते हैं तो कॉल आपको वापस लौटाता है (यानी यह एक गैर-अवरुद्ध कॉल है), तो आप 'DialogResult' मूल्य सीधे पूछताछ करने के लिए स्वतंत्र। यह केवल तभी होता है जब आप 'शोडियलॉग' कहते हैं कि जब तक संवाद को खारिज नहीं किया जाता है तब तक कॉल ब्लॉक। हालांकि बाद के मामले में, आप अभी भी किसी अन्य धागे से ऑब्जेक्ट से पूछताछ करने के लिए स्वतंत्र हैं, जैसा कि आप इंगित करते हैं। –

14

DialogResult संपत्ति Window वर्ग पर परिभाषित किया गया है। सभी Window एस संवाद नहीं हैं। इसलिए, संपत्ति सभी खिड़कियों के लिए प्रासंगिक नहीं है। Window के बजाय Show() के माध्यम से दिखाया गया है (संभवतः, जब तक कि आप इसे किसी कारण से सेट नहीं करते) DialogResult = null है।

Window1.xaml:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Button Name="b1">Show</Button> 
     <Button Name="b2">ShowDialog</Button> 
    </StackPanel> 
</Window> 

Window1.xaml.cs:

यहाँ प्रदर्शित करने के लिए एक सरल उदाहरण है

using System.Windows; 

namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      b1.Click += new RoutedEventHandler(b1_Click); 
      b2.Click += new RoutedEventHandler(b2_Click); 
     } 

     void b1_Click(object sender, RoutedEventArgs e) 
     { 
      var w = new Window(); 
      w.Closed += delegate 
      { 
       MessageBox.Show("" + w.DialogResult); 
      }; 

      w.Show(); 
     } 

     void b2_Click(object sender, RoutedEventArgs e) 
     { 
      var w = new Window(); 
      w.ShowDialog(); 
      MessageBox.Show("" + w.DialogResult); 
     } 
    } 
} 

आप विंडो बंद करते हैं, तो आप 'ध्यान दें कि संवाद में DialogResultfalse है, जबकि गैर-संवाद में null DialogResult है।

+0

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

+1

मेरे लिए, शून्य का अर्थ पूरी तरह से अप्रासंगिक है जबकि कोई भी सुझाव नहीं देता है कि यह प्रासंगिक है लेकिन अभी तक सेट नहीं है। * shrugs * अर्थशास्त्र। –

+0

काफी हद तक मैं इसे दूसरी तरफ पढ़ूंगा। नल एक अनसेट मान है और कोई भी मतलब नहीं है कि कोई संवादप्रवाह नहीं होगा और कभी नहीं होगा। हो सकता है कि उस प्रकार का भ्रम मॉडल बदलने के लिए पर्याप्त कारण था। –

0

शोडियलॉग हमेशा सत्य या गलत वापस आ जाएगा। जब संवाद खुला होता है तो DialogResult केवल शून्य स्थिति ले जाएगा। शून्य से सच्चे या गलत में संक्रमण से संवाद बंद हो जाएगा और शोडियलॉग रिटर्न पर मूल कॉल किया जाएगा।

0

आईएमओ ऐसा इसलिए है क्योंकि DialogResult हमेशा उपयोग नहीं किया जाता है। आप देखते हैं, अगर आप विंडो को अपनी शोडिअलॉग() विधि से कॉल करते हैं, तो आप केवल डायलॉग रेसल्ट सेट कर सकते हैं, अगर आप इसे अपनी शो() विधि से कॉल करते हैं, और डायलॉग रेसल्ट को किसी भी चीज़ पर सेट करने का प्रयास करते हैं, तो यह एक अवैध ऑप्शन अपवाद फेंक देगा। तो मुझे लगता है कि यह कारण है कि यह शून्य है, अगर आप शो() विधि के साथ विंडो को कॉल करते हैं, तो यह शून्य होगा, अगर आप इसे ShowDialog() का उपयोग करके कॉल करते हैं, तो यह आपके ऊपर है।

+0

हम्म यह उत्तर पहले से ही केंट बूगार्ट द्वारा बताया गया था, दोबारा पोस्ट करने के लिए खेद है! – Carlo

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