سؤال

هل من الممكن إنشاء/الحصول على جهاز OpenFileDialog غير وسيط ، لدي عنصر واجهة مستخدم في مربع الحوار الرئيسي والذي يحتاج دائمًا إلى أن يكون المستخدم للضغط عليه.

هل كانت مفيدة؟

المحلول

رقم، OpenFileDialog و SaveFileDialog كلاهما مشتق من filedialog, ، وهو أمر مشروط بطبيعته ، (على حد علمي) لا توجد طريقة لإنشاء نسخة غير وسيطة من أي منهما.

نصائح أخرى

يمكنك إنشاء مؤشر ترابط وجعل الخيط يستضيف 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

من موضوع واجهة المستخدم.

أعلم أنني متأخر قليلاً ، لكن يمكنك إنشاء نموذج جديد ، بلا حدود ، شفاف أو خارج حدود العرض وإظهار تعديل مربع الحوار تلك النافذة.

إنها منشور قديم ، لكنني أقضي يومين في الوصول إلى النتيجة التي أريد تقديمها هنا (مع "السياق" وإكمال رمز @Joshua الذي تم إكماله بالنسبة لي (أخيرًا عندما وضعت .configureawait (صحيح) ، انظر نموذج الكود الأول). ربما تمكنت من كتابة خطوط أقل بناءً على المادة الطويلة من MSDN نموذج الخيوط ما زلت بحاجة إلى القراءة مرة أخرى.

سياقي هو WPF (MVVM الأساسي) ويجب أن أختار ملفًا لكتابة بعض النسخ الاحتياطي .CSV (من بيانات البيانات). أحتاج إلى وظيفة (العضو) ChooseFileFromExtension() كن غير متزامن مع ملف غير محافظ

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

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() إطلاق (بشكل غير متزامن) SaveFileDialog ShowDialog() في موضوع آخر بحيث لا يتم حظر أو تعطيل مؤشر ترابط واجهة المستخدم الرئيسية (... ++) ShowDialog(). TaskCompletionSource<string> tcs ليس كائن واجهة المستخدم WPF ، لذا فإن وصوله بواسطة مؤشر ترابط "واحد" آخر على ما يرام.

لا يزال الحقل أحتاجه لمزيد من الدراسة. أشعر أنه لا توجد وثائق/كتاب "نهائي" حول هذا الموضوع (ربما ينبغي أن يكون له نظرة ثانية على كتب مثل الكتب من ستيفن كليري مرة أخرى). يجب تحسين هذا الرمز على الأقل مع تغطية الموضوع C-sharp-ashynchronous-call-in-endinvoke

إنه يعمل مع Filedialog of Namespace Microsoft.win32

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top