当前位置: 首页 > 编程语言 > C#

C#OpenFileDialog无模式的可能性分享

时间:2023-04-11 02:21:26 C#

C#OpenFileDialog无模式的可能性是否可以创建/拥有一个无模式的.netOpenFileDialog我在主对话框中有一个UI元素,它始终需要用户按下才能使用。不,OpenFileDialog和SaveFileDialog都派生自FileDialog,它本质上是模态的,所以(据我所知),没有办法创建它们的非模态版本。您可以创建一个线程并让该线程承载OpenFileDialog。示例代码缺少任何类型的同步,但它可以工作。publicpartialclassForm1:Form{OFDThreadofdThread;publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){ofdThread=newOFDThread();ofdThread.Show();}}publicclassOFDThread{privateThreadt;私有DialogResult结果;publicOFDThread(){t=newThread(newParameterizedThreadStart(ShowOFD));t.SetApartmentState(ApartmentState.STA);}publicDialogResultDialogResult{get{returnthis.result;}}publicvoidShow(){t.Start(this);}privatevoidShowOFD(objecto){OpenFileDialogofd=newOpenFileDialog();结果=ofd.ShowDialog();使用这段代码,您可以添加一些东西来触发线程中的UI事件(小心调用!)以了解它们何时完成。您可以从UI线程通过DialogResulta=ofdThread.DialogResult访问对话框的结果。我知道我来晚了一点,但您可以创建一个无边框、透明或在显示范围之外的新表单,并显示修改该窗口的文件对话框。这是一篇旧帖子,但我花了2天时间才得到我想在这里展示的结果(带有“上下文”和完整但简化的代码)@Joshua的回答对我有用(最后当我将其更改为Real.ConfigureAwait(true),请参阅第一个代码示例)。也许我可以根据关于MSDN线程模型的长篇文章写更少的行,我仍然需要再读一遍。我的上下文是WPF(基本MVVM),我必须选择一个文件才能编写一些.CSV备份(数据网格)。我需要(成员)函数ChooseFileFromExtension()与非阻塞FileDialog异常步骤classMainWindowExportToExcelCSV:ICommand{...publicasyncvoidExecute(objectparameter){varusr_ctrl=parameterasUserControl;MyFileDialogfd=newMyFileDialog();constboolWhenIComeBackIStillNeedToAccessUIObjectAndThusINeedToRetrieveMyOriginalUIContext=true;stringfilename=awaitfd.ChooseFileFromExtension("CSV文件(*.csv)|*.csv|所有文件(*.*)|*.*").ConfigureAwait(WhenIComeBackIStillNeedToAccessUIObjectAndThusINeedToRetrieveMyOriginalUIContext);Visualvisual=(Visual)usr_ctrl.Content;for(inti=0;i和MyFileDialog类的代码usingMicrosoft.Win32;...classMyFileDialog{//https://msdn.microsoft.com/zh-cn/library/ms741870(v=vs.110).aspx//关于线程模型的文章privatedelegatevoidOneArgStrDelegate(stringstr);privatevoidMyExternalDialog(stringextensions){SaveFileDialogfd=newSaveFileDialog();fd.Filter=extensions;fd.ShowDialog();tcs.SetResult(fd.文件名我);私有任务完成源tcs;publicTaskChooseFileFromExtension(stringfile_ext){//CfPuppetTaskinAsyncinC#5.0byAlexDaviestcs=newTaskCompletionSource();OneArgStrDelegatefetcher=newOneArgStrDelegate(this.MyExternalDialog);BeginInvoke(file_ext,null,null);返回tcs.Task;fetcher.BeginInvoke()在另一个线程中(异步地)启动SaveFileDialogShowDialog(),这样主UI线程/窗口(...++)既不会被阻止也不会被禁用,因为它们只是直接调用ShowDialog()TaskCompletionSourcetcs不是WPFUI对象,因此可以由另一个“单个”线程访问。这仍然是我需要进一步研究的领域。我觉得没有关于这个主题的“最终”文档/书籍(也许应该再看看像StephenCleary这样的书籍)。至少应该使用c-sharp-asynchronous-call-without-endinvoke中涵盖的主题改进此代码它适用于名称空间Microsoft中的FileDialog。如果对你有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: