C # OpenFileDialog posible no modal

¿Es posible crear / tener un .Net OpenFileDialog no modal Tengo un elemento UI en el cuadro de diálogo principal que siempre debe estar disponible para que el usuario presione.

No, OpenFileDialog y SaveFileDialog se derivan de FileDialog , que es inherentemente modal, por lo que (hasta donde sé) no hay forma de crear una versión no modal de ninguno de ellos.

Puede crear un hilo y hacer que el hilo aloje OpenFileDialog. El código de ejemplo carece de cualquier tipo de sincronización, pero funciona.

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(); } } 

Con este código, puede agregar algo para activar un evento en su hilo de interfaz de usuario (¡tenga cuidado al invocar!) Para saber cuándo terminaron. Puede acceder al resultado del diálogo por

 DialogResult a = ofdThread.DialogResult 

desde tu hilo de interfaz de usuario

Sé que llego un poco tarde, pero puede crear un nuevo formulario, sin márgenes, transparente o fuera de los límites de la pantalla y mostrar el cuadro de diálogo de archivo modificando esa ventana.

Es una publicación antigua, pero paso 2 días alcanzando el resultado que quiero presentar aquí (con “contexto” y código completo pero simplificado). La respuesta de Joshua funcionó para mí (al final cuando puse en verdad a .ConfigureAwait (verdadero) , ver el primer ejemplo de código). Tal vez pude escribir menos líneas basadas en el largo artículo de MSDN Threading Model que aún necesito leer una vez más.

Mi contexto es WPF (MVVM básico) y debo elegir un archivo para escribir alguna copia de seguridad .CSV (de una cuadrícula de datos). Necesito que la función (miembro) ChooseFileFromExtension() sea ​​asíncrona con un FileDialog no bloqueante

 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 } } } 

y el código para la clase 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 tcs; public Task ChooseFileFromExtension(string file_ext) { //Cf Puppet Task in Async in C#5.0 by Alex Davies tcs = new TaskCompletionSource(); OneArgStrDelegate fetcher = new OneArgStrDelegate(this.MyExternalDialog); fetcher.BeginInvoke(file_ext, null, null); return tcs.Task; } } 

El fetcher.BeginInvoke() inicia (asincrónicamente) SaveFileDialog ShowDialog() en otro hilo de modo que el subproceso / la ventana principal de UI (... ++) no se bloquean ni deshabilitan como lo hubieran sido con una simple llamada directa a ShowDialog() . TaskCompletionSource tcs no es un Objeto de interfaz de usuario de WPF, por lo que su acceso por otro subproceso "único" es correcto.

Todavía es un campo que necesito estudiar más a fondo. Siento que no hay documentación / libro "definitivo" sobre el tema (tal vez debería echarle un segundo vistazo a libros como el de Stephen Cleary nuevamente). Este código debería mejorarse al menos con el tema cubierto en c-sharp-asynchronous-call-without-endinvoke

Funciona con el FileDialog del espacio de nombres Microsoft.Win32