2011-11-04 10 views
11

मेरे ऐप में 'ओपन फाइल' बटन है। OpenFileDialog लॉन्च करने से पहले, यह पूछता है कि क्या उपयोगकर्ता वर्तमान फ़ाइल को सहेजना चाहता है, और यदि वे करते हैं, तो यह एक SaveFileDialog लॉन्च करता है। इसके बाद यह ओपनफाइलडियलॉग लॉन्च करता है। सुंदर मानक सामान।"संवाद को उपयोगकर्ता द्वारा शुरू किया जाना चाहिए" अपवाद को रोकने का कोई तरीका?

मेरी समस्या यह है कि चांदी की रोशनी तब OpenFileDialog.ShowDialog() विधि को उपयोगकर्ता द्वारा शुरू की गई नहीं है, और मुझे सुरक्षा अपवाद मिलता है।

क्या इस अपवाद से बचने के लिए कोई ज्ञात उचित तरीका है? निश्चित रूप से यह एक सुंदर मानक परिदृश्य है?

ऐप एक ब्राउज़र के भीतर है।

किसी भी विचारों का स्वागत करते

संपादित करें:

क्षमा करें, वास्तविक कोड जारी करने के लिए अनुमति नहीं :(तर्क हालांकि बहुत सरल है: psuedocode में 'OpenFile "बटन प्रेस घटना की तरह एक विधि कुछ कहता है:

* पहले बचाने के लिए है कि क्या पूछ एक नया SL संदेश लॉन्च

* संदेश विंडो पर हां/नहीं क्लिक किया:। -अगर नहीं है, लोड करने के लिए जाओ -अगर हाँ, लॉन्च SaveFileDialog.Sho एक खुला फ़ाइल संवाद

संपादित 2 लॉन्च: wDialog(), लोड करने के लिए

* लोड जाना मिनी कार्यक्रम ... मुख्य पृष्ठ के लिए

एक्सएमएल सामग्री:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Button Content="Open" Click="Button_Click"/> 
</Grid> 

कोड:

using System.Windows; 
using System.Windows.Controls; 

namespace SilverlightApplication15 
{ 
public partial class MainPage : UserControl 
{ 
    AskWindow aw = new AskWindow(); 

    public MainPage() 
    { 
     InitializeComponent(); 
     aw.Closed += new System.EventHandler(aw_Closed); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     aw.Show(); 
    } 

    private void aw_Closed(object sender, System.EventArgs e) 
    { 
     if (aw.DialogResult == true) 
     { 
      SaveFileDialog svd = new SaveFileDialog(); 
      svd.ShowDialog(); 
     } 


     OpenFileDialog ofd = new OpenFileDialog(); 
     ofd.ShowDialog();//Causes security exception 
    } 
} 

public class AskWindow : ChildWindow 
{ 
    public AskWindow() 
    { 
     Button b = new System.Windows.Controls.Button(); 
     b.Click += new System.Windows.RoutedEventHandler(b_Click); 
     b.Content = "Yes, save it"; 
     this.Content = b; 
    } 

    private void b_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
    } 
} 
} 
+1

क्या आप अपना कोड पोस्ट कर सकते हैं। – ChrisF

+0

क्या आपने ShowDialog() जैसे ShowDialog (स्ट्रिंग प्रश्न) के लिए एक्सटेंशन विधि लिखने का प्रयास किया है जो पहले MsgBox दिखाएगा और फिर संभवतः मूल ShowDiaglog() को कॉल करेगा? – neurotix

+0

@ यूरोटिक्स: मैंने इसे अभी दिया है; एक ही परिणाम मुझे डर है :( – user495625

उत्तर

3

यह डेस्कटॉप एप्लिकेशन के लिए एक मानक परिदृश्य हो सकता है लेकिन आप डेस्कटॉप एप्लिकेशन नहीं बना रहे हैं। आप एक घटक बना रहे हैं जो एक सुरक्षित सैंडबॉक्स में चलता है और यह अच्छे कारणों के लिए कुछ कड़े प्रतिबंधों के साथ आता है।

इस परिदृश्य को संभालने का कोई आसान तरीका नहीं है। आप एक करीबी "दस्तावेज़" सुविधा प्रदान कर सकते हैं जो एक पुष्टिकरण बॉक्स को पॉपअप करेगा जो लगातार जारी रखेगा काम जारी कर देगा।

जबकि वर्तमान एक और "दस्तावेज़" खुला करने की कोशिश में सब आप कर सकते हैं प्रदर्शन अपने विकल्पों पर उपयोगकर्ता को निर्देश संदेश है, या तो वर्तमान "दस्तावेज़" को बंद करने और अपने परिवर्तनों को रोकने के या बचाने के लिए चुनने के लिए न सहेजा गया है। उपयोगकर्ता को इन क्रियाओं को मैन्युअल रूप से निष्पादित करना होगा और फिर "दस्तावेज़" खोलने के लिए फिर से चयन करना होगा।

यदि आपके ऐप ने कई "खुले" दस्तावेज़ों का समर्थन किया है, तो आप कुछ चीजों को बेहतर बनाने में सक्षम हो सकते हैं, कम से कम उपयोगकर्ता को "दस्तावेज़" खोलने के लिए कर नहीं लगाया जाएगा।

+0

अरे, आपके उत्तर के लिए धन्यवाद। क्या मैं आपसे यही सवाल फेंक सकता हूं कि मैंने ऊपर यहोहो से पूछा था? ओपनफिल्डियोलॉग को संदेश बॉक्स में अलग-अलग क्यों माना जाता है? जैसे निम्नलिखित अपवाद का कारण नहीं बनता है, और फिर भी उपयोगकर्ता को 'स्पैम' करता है: (int i = 0; i <1000000; i ++) {MessageBox.Show ("स्पैम!"); } – user495625

+0

स्पैमिंग उपयोगकर्ता को कम हानिकारक माना जाता है क्योंकि वास्तविक उपयोगकर्ताओं को एसएल एप्लिकेशन acces को SaveAs या OpenFile संवादों के माध्यम से प्राप्त किया जाता है जहां पहली बार डिस्क पर वायरस लिखने के लिए उपयोग किया जा सकता है, और दूसरा उपयोगकर्ता से समझदार जानकारी चोरी करने के लिए उपयोग किया जा सकता है। –

4

वाई का संक्षिप्त उत्तर हमारा प्रश्न "नहीं" है, क्योंकि दूसरे डायलॉग को चांदी के रनटाइम के लिए अब उपयोगकर्ता द्वारा शुरू नहीं किया गया है। यदि आप संवाद खोलने से पहले एक संदेश बॉक्स प्रदर्शित करते हैं तो वही सच है।

Here's पर संवाद

सुरक्षा उद्देश्यों के लिए MSDN से कुछ जानकारी सुरक्षा प्रतिबंध के बारे में, अगर एक Silverlight अनुप्रयोग है एक sandboxed आवेदन, फ़ाइल और प्रिंट संवाद बॉक्स उपयोगकर्ता द्वारा आरंभ किया जाना चाहिए। इसका मतलब है कि आपको उन्हें उपयोगकर्ता द्वारा शुरू की गई कार्रवाई से दिखाना चाहिए, जैसे कि बटन के लिए क्लिक ईवेंट हैंडलर। यदि आप गैर-उपयोगकर्ता द्वारा शुरू किए गए कोड से एक संवाद बॉक्स दिखाने का प्रयास करते हैं, तो सुरक्षा अपवाद होगा। इसके अतिरिक्त, उस समय की सीमा है जब उपयोगकर्ता संवाद शुरू करता है और जब संवाद दिखाया जाता है। यदि इन कार्यों के बीच की समय सीमा पार हो गई है, तो एक अपवाद होगा। जब आप एक संवाद बॉक्स के साथ विजुअल स्टूडियो डीबगर का उपयोग कर रहे हैं, तो यदि आप संवाद बॉक्स निर्माण और संवाद बॉक्स दिखाते हुए ब्रेकपॉइंट सेट करते हैं तो सुरक्षा अपवाद फेंक दिया जाएगा। उपयोगकर्ता द्वारा शुरू किए गए प्रतिबंधों के कारण, यह अपेक्षित व्यवहार है। यदि आप ShowDialog पर कॉल के बाद ब्रेकपॉइंट सेट करते हैं, तो कोई अपवाद नहीं फेंक दिया जाएगा।

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

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

समय सीमा है, आसानी से निम्न कोड के साथ परीक्षण किया जा सकता है:

private void OpenDialog(object sender, RoutedEventArgs e) { 
    MessageBox.Show("test"); 

    OpenFileDialog fileDialog = new OpenFileDialog(); 
    var result = fileDialog.ShowDialog(); 
} 

जब आप वास्तव में तेजी से "Enter" दबाने -कुंजी जब MessageBox प्रदर्शित किया जाता है, OpenFileDialog बाद में प्रदर्शित किया जाता है, ऊपर उठाने नहीं सुरक्षा अपवाद। लेकिन अगर आप संदेश बॉक्स को बंद करने के बाद संदेशबॉक्स को थोड़ी देर के लिए खोलते हैं तो सुरक्षा अपवाद उठाया जाता है।

मुझे लगता है कि समय सीमा दो संवादों को एक दूसरे के बाद दिखा रही है, क्योंकि समय सीमा पहले को दिखाएगी।

+0

अरे आपके उत्तर के लिए धन्यवाद। हालांकि एक प्रश्न: ओपनफिल्डियोलॉग को संदेश बॉक्स में अलग-अलग क्यों माना जाता है? उदा। निम्नलिखित अपवाद का कारण नहीं बनता है, और फिर भी उपयोगकर्ता को (int i = 0; i <1000000; i ++) { संदेशबॉक्स। दिखाएं ("स्पैम!"); } – user495625

+0

@ user495625: एक संदेशबॉक्स केवल टेक्स्ट प्रदर्शित करता है, जबकि ओपनफाइलडिअलॉग/सेवफाइलडिअलॉग स्थानीय फ़ाइलों और संसाधनों तक पहुंचने के लिए उपयोग किया जाता है और इसलिए उच्च सुरक्षा जोखिम होता है। – Jehof

0

आपको माउस Click हैंडलर में तुरंत SaveFileDialog दिखाना चाहिए। आपके मामले में private void b_Click में होगा।

माउस क्लिक और SaveFileDialog के बीच कुछ बाधाओं को डालने से काम नहीं करेगा।

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

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