ダイアログを開いたままにして、場合によってはユーザーが入力したファイル名を別のファイル名に置き換えるために、イベントに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
全体を自分で書き直すことができることはわかっていますが(またはNuffSaveFileDialog のようなコードや SaveFileDialogのCodeProject 拡張機能を使用することもできます)、技術的な理由から標準の WinForms クラスを使用したいと思います。SaveFileDialog