是否可以创建/具有非模式.NET OpenFileDialog I在主对话框中具有UI元素,该元素始终需要可供用户按下。

有帮助吗?

解决方案

不, openfiledialogSavefiledialog 都来自 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();
    }
}

使用此代码,您可以在UI线程中添加一些东西来启动事件(请小心调用!)以了解何时完成。您可以访问对话框的结果

DialogResult a = ofdThread.DialogResult

从您的UI线程。

我知道我已经有点晚了,但是您可以创建一个新的表单,即无边界,透明或显示边界外,并显示该窗口的文件对话框修改。

这是一篇古老的帖子,但我花了2天的时间达到我想在此处展示的结果(带有“上下文”并完整但简化的代码)@Joshua的答案对我有用(最后,当我忠于.configureawait(true)时,请参阅第一个代码样本)。也许我能够根据MSDN的长篇文章来少写线条 线程模型 我仍然需要再次阅读。

我的上下文是WPF(基本MVVM),我必须选择一个文件才能编写一些.CSV备份(DataGrid)。我需要(成员)功能 ChooseFileFromExtension() 与非阻滞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类的代码

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() 在另一个线程中,以使主UI线程 /窗口(... ++)既不会被阻止也不是禁用 ShowDialog(). TaskCompletionSource<string> tcs 不是WPF UI对象,因此可以通过另一个“单个”线程访问其访问。

这仍然是我需要进一步研究的领域。我觉得没有关于该主题的“终极”文档/书籍(也许应该再次看一下《史蒂芬·克莱里(Stephen Cleary)》的书籍)。该代码至少应在主题上进行改进 c-sharp-ansnchronous-Call-call-to-distinvoke

它与命名空间Microsoft.win32的filedialog一起使用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top