如何替换文件名中SaveFileDialog.FileOk事件处理程序(How to replace

2019-10-18 00:33发布

我想改变的文件名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类技术原因。

Answer 1:

让我用反射的对话框手柄,然后叫SetFileName与手柄:

dialog.FileOk +=
    delegate (object sender, CancelEventArgs e)
    {
        if (dialog.FileName.EndsWith (".foo"))
        {
            Type type = typeof(FileDialog);
            FieldInfo info = type.GetField("dialogHWnd", BindingFlags.NonPublic 
                                                       | BindingFlags.Instance);
            IntPtr fileDialogHandle = (IntPtr)info.GetValue(dialog);

            SetFileName(fileDialogHandle, "xyz.bar");
            e.Cancel = true;
        }
    };

注:在你的Win32类,你只需要定义SetDlgItemText功能(没有必要GetParent ),并传递给它的话柄:

    [DllImport("User32")]
    public static extern int SetDlgItemText(IntPtr hwnd, int id, string title);

    public const int FileTitleCntrlID = 0x47c;

    void SetFileName(IntPtr hdlg, string name)
    {
        SetDlgItemText(hdlg, FileTitleCntrlID, name);
    }

编辑:

有前面的代码在Windows 7上工作(?Vista还我认为),对话框的属性设置ShowHelptrue

dialog.ShowHelp = true;

外观将改变一点点,但我不认为这是一个大问题。



文章来源: How to replace FileName in SaveFileDialog.FileOk event handler