C#OpenFileDialog非模式可能
-
20-08-2019 - |
题
是否可以创建/具有非模式.NET OpenFileDialog I在主对话框中具有UI元素,该元素始终需要可供用户按下。
解决方案
不, 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();
}
}
使用此代码,您可以在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一起使用