是否有可能創建/有一個非模態.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