silverlight - धागा को रोकने के लिए डायलॉग की पुष्टि करें




dialog confirm (2)

मैं Silverlight के ChildWindow ऑब्जेक्ट का उपयोग कर एक पुष्टिकरण ChildWindow करने के लिए कोशिश कर रहा हूं।

आदर्श रूप में, मैं इसे MessageBox.Show() तरह कार्य करना चाहता हूं, जहां उपयोगकर्ता से इनपुट प्राप्त होने तक संपूर्ण एप्लिकेशन रोक देता है।

उदाहरण के लिए:

for (int i = 0; i < 5; i++)
{
    if (i==3 && MessageBox.Show("Exit early?",
        "Iterator", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
    {
        break;
    }
}

यदि उपयोगकर्ता ठीक ठीक हो जाता है तो 3 पर चलना बंद हो जाएगा ...

हालांकि, अगर मैं लाइनों के साथ कुछ करना था:

ChildWindow confirm = new ChildWindow();
confirm.Title = "Iterator";
confirm.HasCloseButton = false;
Grid container = new Grid();

Button closeBtn = new Button();
closeBtn.Content = "Exit early";
closeBtn.Click += delegate { confirm.DialogResult = true; confirm.Close(); };
container.Children.Add(closeBtn);

Button continueBtn = new Button();
continueBtn.Content = "Continue!";
continueBtn.Click += delegate { confirm.DialogResult = false; confirm.Close(); };
container.Children.Add(continueBtn);

confirm.Content = container;

for(int i=0;i<5;i++) {
  if (i==3) {
    confirm.Show();
    if (confirm.DialogResult.HasResult && (bool)confirm.DialogResult) {
      break;
    }
  }
}

यह स्पष्ट रूप से काम नहीं करेगा, क्योंकि थ्रेड को नहीं रोक दिया गया है ... confirm.DialogResult.HasResultconfirm.DialogResult.HasResultconfirm.DialogResult.HasResult गलत होगा, और लूप 3

मैं बस सोच रहा हूं, मैं इस बारे में ठीक से कैसे जा सकता हूं। सिल्वरलाइट एकल-थ्रेडेड है, इसलिए मैं थ्रेड को सोता ही नहीं रख सकता और तब जब मैं तैयार हूं, तब इसे जगाइए, इसलिए मैं सोच रहा हूं कि क्या कुछ और भी है जो लोग सुझा सकते हैं?

मैंने तर्क को पीछे करने पर विचार किया है - यानी, वह क्रियाओं को पारित करना जो मैं हां / नो इवेंट्स में करना चाहता हूं, लेकिन मेरे विशिष्ट मामले में यह काफी काम नहीं करेगा।

अग्रिम में धन्यवाद!


इस परियोजना को http://silverlightmsgbox.codeplex.com/ देखें । यह कई उपयोगी संदेश बॉक्सों की एक सरल लेकिन प्रस्तुत करने योग्य कार्यान्वयन प्रस्तुत करता है अर्थात, पुष्टि, त्रुटि, जानकारी, उपयोगकर्ता इनपुट आदि। और आपके लिए उपयोगी हो सकती है। सौभाग्य।


आप आरएक्स फ्रेमवर्क के साथ इस शांत आसानी से प्राप्त कर सकते हैं:

var continued = Observable.FromEvent<RoutedEventArgs>(continueBtn, "Click");

var iter = new Subject<int>();

var ask = iter.Where(i => i == 3).Do(_ => confirm.Show());

iter.Where(i => i != 3 && i < 10)
    .Merge(ask.Zip(continued, (i, _) => i))
    .Do(i => Debug.WriteLine("Do something for iteration {0}", i))
    .Select(i => i + 1)
    .Subscribe(iter);

iter.OnNext(0);

किसी डायलॉग को कब दिखाया जाए, इसका निर्धारण करने के लिए किसी भी नियम के समाधान आसानी से तराजू हैं। उदाहरण के लिए हम दोहराव को अवरुद्ध करना चाहते हैं और हर 3 पुनरावृत्तियों पर उपयोगकर्ता की पुष्टि का अनुरोध करते हैं। आपको बस इतना करना होगा कि i == 3 स्थिति i == 3 i % 3 == 0 i != 3 और i != 3 साथ।