在不使用 pinvoke 的情况下以编程方式关闭 SaveFileDialog/OpenFileDialog
Close SaveFileDialog/OpenFileDialog programmatically without using pinvoke
由于某些要求,我必须在不使用 PINVOKE 的情况下以编程方式关闭 SaveFileDialog
。
除了使用 PINVOKE 方式,还有什么方法可以关闭 SaveFileDialog
吗?
我曾尝试关闭 SaveFileDialog
的所有者表单,但 SaveFileDialog
仍然存在。
我尝试过的:
- 关闭执行
SaveFileDialog
的 ShowDialog()
的表单。
SaveFileDialog.Dispose()
关闭传递给 ShowDialog(owner);
方法的 owner
window 应该有效。例如:
private static Form CreateDummyForm(Form owner) {
Form dummy = new Form();
IntPtr hwnd = dummy.Handle; // force handle creation
if (owner != null) {
dummy.Owner = owner;
dummy.Location = owner.Location;
owner.LocationChanged += delegate {
dummy.Location = owner.Location;
};
}
return dummy;
}
[STAThread]
static void Main() {
Form form = new Form();
form.Size = new Size(400,400);
Button btn = new Button { Text = "btn" };
btn.Click += delegate {
SaveFileDialog fsd = new SaveFileDialog();
int timeoutMillis = 5000;
Form dummy = CreateDummyForm(form); // Close disposes the dummy form
Task.Delay(TimeSpan.FromMilliseconds(timeoutMillis)).ContinueWith((t) => { dummy.Close(); dummy.Dispose(); }, TaskScheduler.FromCurrentSynchronizationContext());
fsd.ShowDialog(dummy);
fsd.Dispose();
};
form.Controls.Add(btn);
Application.Run(form);
}
如果您使用 visual studio 设计器添加一个 SaveFileDialog,您的表单将在表单的生命周期内有一个包含此对话框的字段。
仅在需要时创建 SaveFileDialog 效率更高且更容易。如果您在 using
语句中执行此操作,则不必处理 Disposing 它,当然也不需要 PInvoke
private void MenuItem_FileSaveAs_Clicked(object sender, ...)
{
using (var dlg = new SaveFileDialog())
{
dlg.FileName = this.FileName;
dlg.InitialDirectory = ...
dlg.DefaultExt = ...
...
// Show the SaveFileDialog, and if Ok save the file
var dlgResult = dlg.ShowDialog(this);
if (dlgResult == DialogResult.OK)
{
// operator selected a file and pressed OK
this.FileName = dlg.FileName;
this.SaveFile(this.FileName);
}
}
}
由于某些要求,我必须在不使用 PINVOKE 的情况下以编程方式关闭 SaveFileDialog
。
除了使用 PINVOKE 方式,还有什么方法可以关闭 SaveFileDialog
吗?
我曾尝试关闭 SaveFileDialog
的所有者表单,但 SaveFileDialog
仍然存在。
我尝试过的:
- 关闭执行
SaveFileDialog
的ShowDialog()
的表单。 SaveFileDialog.Dispose()
关闭传递给 ShowDialog(owner);
方法的 owner
window 应该有效。例如:
private static Form CreateDummyForm(Form owner) {
Form dummy = new Form();
IntPtr hwnd = dummy.Handle; // force handle creation
if (owner != null) {
dummy.Owner = owner;
dummy.Location = owner.Location;
owner.LocationChanged += delegate {
dummy.Location = owner.Location;
};
}
return dummy;
}
[STAThread]
static void Main() {
Form form = new Form();
form.Size = new Size(400,400);
Button btn = new Button { Text = "btn" };
btn.Click += delegate {
SaveFileDialog fsd = new SaveFileDialog();
int timeoutMillis = 5000;
Form dummy = CreateDummyForm(form); // Close disposes the dummy form
Task.Delay(TimeSpan.FromMilliseconds(timeoutMillis)).ContinueWith((t) => { dummy.Close(); dummy.Dispose(); }, TaskScheduler.FromCurrentSynchronizationContext());
fsd.ShowDialog(dummy);
fsd.Dispose();
};
form.Controls.Add(btn);
Application.Run(form);
}
如果您使用 visual studio 设计器添加一个 SaveFileDialog,您的表单将在表单的生命周期内有一个包含此对话框的字段。
仅在需要时创建 SaveFileDialog 效率更高且更容易。如果您在 using
语句中执行此操作,则不必处理 Disposing 它,当然也不需要 PInvoke
private void MenuItem_FileSaveAs_Clicked(object sender, ...)
{
using (var dlg = new SaveFileDialog())
{
dlg.FileName = this.FileName;
dlg.InitialDirectory = ...
dlg.DefaultExt = ...
...
// Show the SaveFileDialog, and if Ok save the file
var dlgResult = dlg.ShowDialog(this);
if (dlgResult == DialogResult.OK)
{
// operator selected a file and pressed OK
this.FileName = dlg.FileName;
this.SaveFile(this.FileName);
}
}
}