是否有可能创建/有一个非模态.net OpenFileDialog我有一个UI元素在主对话框中,总是需要可供用户按下。C#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();
}
}
有了这个代码,你可以添加一些在你的UI线程触发一个事件(小心调用!)知道他们在做的时候。你可以通过你的UI线程访问
DialogResult a = ofdThread.DialogResult
的结果。
我知道我有点迟了,但您可以创建一个新的窗体,无边框,透明或超出显示范围,并显示修改该窗口的文件对话框。
这是一个旧的帖子,但我花了2天达到我想在这里呈现的结果(带有“上下文”和完整但简化的代码) @Joshua的答案为我工作(最后,当我把真正的.ConfigureAwait(true),看第一个代码示例)。也许我能够根据MSDN Threading Model的长文章写出更少的行,我仍然需要再次阅读。
我的上下文是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对象,因此可以通过另一个“单个”线程访问它。
这仍然是我需要进一步研究的领域。我觉得没有关于这个主题的“终极”文献/书籍(也许应该再次看一下斯蒂芬克莱里的书)。此代码至少应该覆盖上c-sharp-asynchronous-call-without-endinvoke
话题来提高它的工作原理与命名空间的Microsoft.Win32
- 1. BottomSheetDialogFragment非模态
- 2. C#WPF非静态命令的实现可能吗?
- 3. C#在模态窗体前引入非模态窗体?
- 4. C++:性能上非模板委托类
- 5. 可能模板类型或非类型?
- 6. C#静态类 - 静态类不能有非静态成员
- 7. 非模态“状态”形式
- 8. 模拟OpenFileDialog的选项
- 9. C#OpenFileDialog存储路径
- 10. C#:openfiledialog过滤问题
- 11. C#OpenFileDialog锁定目录
- 12. 默认名称与OpenFileDialog C#?
- 13. 非模态WinForms FontDialog?
- 14. jquery jdialog非模态
- 15. SWT模态对话框非模态
- 16. 模态对话框变为非模态
- 17. 模态和非模态形式
- 18. 打开模态和非模态
- 19. 即使在非活动状态下,弹出窗口(非模态)仍然可见
- 20. 静态和非静态版本的C#中的相同功能#
- 21. Obj-C,是否有一种过渡效果可以同时适用于模态视图和非模态视图?
- 22. 非模态JFace对话框?
- 23. 如何使dijit.Dialog非模态
- 24. Wicket 1.5非模态窗口
- 25. Winforms非模态通知
- 26. 非静态Slf4j MDC模式
- 27. 使用Silverlight OpenFileDialog从文件中获取FullName是不可能的?
- 28. 我可以在C:\ Users \ Public \ Documents中启动DotNet的OpenFileDialog吗?
- 29. C中可能是多态吗?
- 30. 是有可能把非(静态常量积分)类型在C++ Header.h文件
悲伤的FileDialog的,但互联网同意... – maxfridbe 2009-02-24 21:15:51