我想更改SaveFileDialog
附加到FileOk
事件的事件处理程序中的文件名,以便在某些情况下用另一个文件名替换用户输入的文件名,同时保持对话框打开:
var dialog = new SaveFileDialog();
...
dialog.FileOk +=
delegate (object sender, CancelEventArgs e)
{
if (dialog.FileName.EndsWith (".foo"))
{
dialog.FileName = "xyz.bar";
e.Cancel = true;
}
};
单步执行代码表明FileName
确实正确更新了,但是当事件处理程序返回时,对话框中显示的文件名没有改变。我已经看到理论上我可以使用如下 Win32 代码来更改对话框本身的文件名:
class Win32
{
[DllImport("User32")]
public static extern IntPtr GetParent(IntPtr);
[DllImport("User32")]
public static extern int SetDlgItemText(IntPtr, int string, int);
public const int FileTitleCntrlID = 0x47c;
}
void SetFileName(IntPtr hdlg, string name)
{
Win32.SetDlgItemText (Win32.GetParent (hdlg), Win32.FileTitleCntrlID, name);
}
但是,我不知道从哪里可以获得HDLG
与SaveFileDialog
实例相关联的信息。我知道我可以自己重写整个SaveFileDialog
包装器(或使用NuffSaveFileDialog 之类的代码或 SaveFileDialog的CodeProject 扩展),但出于技术原因,我更喜欢使用标准的 WinForms 类。