2009-01-25 6 views
6

क्या यह एक गैर-मोडल .NET OpenFileDialog बनाने/बनाने के लिए संभव है मेरे पास मुख्य संवाद में यूआई तत्व है जिसे उपयोगकर्ता को हमेशा प्रेस करने के लिए उपलब्ध होना आवश्यक है।सी # ओपनफाइलडियलॉग गैर-मोडल संभव

उत्तर

5

नहीं है, OpenFileDialog और SaveFileDialog दोनों FileDialog है, जो स्वाभाविक मोडल है, इसलिए से प्राप्त कर रहे (मैं जानता हूँ कि जहाँ तक) उनमें से या तो का एक गैर-मोडल संस्करण बनाने का कोई रास्ता नहीं है।

+0

Sad के FileDialog साथ काम करता है, लेकिन इंटरनेट भी इससे सहमत हैं ... – maxfridbe

6

आप एक थ्रेड बना सकते हैं और थ्रेड को OpenFileDialog होस्ट कर सकते हैं। उदाहरण कोड में किसी भी तरह का सिंक्रनाइज़ेशन की कमी है लेकिन यह काम करता है।

public partial class Form1 : Form 
{ 
    OFDThread ofdThread; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ofdThread = new OFDThread(); 
     ofdThread.Show(); 
    } 
} 

public class OFDThread 
{ 
    private Thread t; 
    private DialogResult result; 

    public OFDThread() 
    { 
     t = new Thread(new ParameterizedThreadStart(ShowOFD)); 
     t.SetApartmentState(ApartmentState.STA); 
    } 

    public DialogResult DialogResult { get { return this.result; } } 

    public void Show() 
    { 
     t.Start(this); 
    } 

    private void ShowOFD(object o) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     result = ofd.ShowDialog(); 
    } 
} 
आप अपने यूआई सूत्र में कोई ईवेंट सक्रिय करने के लिए कुछ (लागू के साथ सावधान रहना!) जब वे काम हो गया पता करने के लिए जोड़ सकते हैं इस कोड के साथ

। आप अपने यूआई थ्रेड से

DialogResult a = ofdThread.DialogResult 

द्वारा संवाद के परिणाम तक पहुंच सकते हैं।

1

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

0

यह एक पुरानी पोस्ट है, लेकिन मैं परिणाम प्रस्तुत करने में 2 दिन व्यतीत करता हूं, जिसमें मैं यहां उपस्थित होना चाहता हूं ("संदर्भ" और पूर्ण लेकिन सरलीकृत कोड के साथ) @ जोशुआ का जवाब मेरे लिए काम करता है (आखिरकार जब मैंने सच किया .ConfigureAwait (सच), पहले कोड नमूना देखें)। शायद मैं एमएसडीएन Threading Model के लंबे लेख के आधार पर कम लाइनें लिखने में सक्षम था कि मुझे अभी भी एक बार फिर से पढ़ने की जरूरत है।

मेरा संदर्भ WPF (मूल एमवीवीएम) है और मुझे कुछ लिखने के लिए एक फ़ाइल चुननी होगी। सीएसवी बैकअप (डेटाग्रिड का)। मैं रखना आवश्यक है (सदस्य) समारोह एक गैर अवरुद्ध FileDialog

class MainWindowExportToExcelCSV : ICommand 
{ 
    ... 
    public async void Execute(object parameter) 
    { 
     var usr_ctrl = parameter as UserControl; 
     MyFileDialog fd = new MyFileDialog(); 
     const bool WhenIComeBackIStillNeedToAccessUIObjectAndThusINeedToRetrieveMyOriginalUIContext = true; 
     string filename = await fd.ChooseFileFromExtension("CSV files (*.csv)|*.csv|All files (*.*)|*.*").ConfigureAwait(
      WhenIComeBackIStillNeedToAccessUIObjectAndThusINeedToRetrieveMyOriginalUIContext); 

     Visual visual = (Visual)usr_ctrl.Content; 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++) 
     { 
      //look for datagrid element 
     } 
    } 
} 

और MyFileDialog वर्ग के लिए कोड के साथ अतुल्यकालिक होने ChooseFileFromExtension()

using Microsoft.Win32; 
... 

class MyFileDialog 
{ 
    //https://msdn.microsoft.com/en-us/library/ms741870(v=vs.110).aspx 
    //Article on Threading Model 
    private delegate void OneArgStrDelegate(string str); 

    private void MyExternalDialog(string extensions) 
    { 
     SaveFileDialog fd = new SaveFileDialog(); 
     fd.Filter = extensions; 
     fd.ShowDialog(); 
     tcs.SetResult(fd.FileName); 
    } 

    private TaskCompletionSource<string> tcs; 

    public Task<string> ChooseFileFromExtension(string file_ext) 
    { 
     //Cf Puppet Task in Async in C#5.0 by Alex Davies 
     tcs = new TaskCompletionSource<string>(); 

     OneArgStrDelegate fetcher = new OneArgStrDelegate(this.MyExternalDialog); 
     fetcher.BeginInvoke(file_ext, null, null); 
     return tcs.Task; 
    } 
} 

fetcher.BeginInvoke() की शुरूआत (अतुल्यकालिक रूप से) SaveFileDialogShowDialog() एक और धागा में तो कि मुख्य यूआई थ्रेड/विंडो (... ++) न तो अवरुद्ध हैं और न ही अक्षम हैं क्योंकि वे ShowDialog() पर एक साधारण सीधी कॉल के साथ होते। TaskCompletionSource<string> tcs एक WPF UI ऑब्जेक्ट नहीं है, इसलिए इसे "सिंगल" थ्रेड द्वारा एक्सेस किया गया है ठीक है।

यह अभी भी एक ऐसा क्षेत्र है जहां मुझे आगे अध्ययन करने की आवश्यकता है। मुझे लगता है कि इस विषय पर कोई "परम" दस्तावेज/पुस्तक नहीं है (शायद स्टीफन क्लेरी से एक जैसी किताबों के लिए दूसरी बार देखना चाहिए)। इस कोड c-sharp-asynchronous-call-without-endinvoke

पर कवर विषय के साथ कम से कम सुधार किया जाना चाहिए यह नाम स्थान Microsoft.Win32