Как закрыть Win32 SaveFileDialog при возникновении ошибки? - PullRequest
2 голосов
/ 15 августа 2011

Я столкнулся с проблемой с Microsoft.Win32.SaveFileDialog в нашем Wpf-приложении.

Если пользователь вводит огромный путь к файлу, превышающий допустимый максимум (я думаю, что это 255 символов?), В пределах SaveFileDialog, то он начинает становиться непригодным (подробности об этом в примере кода).

Так что в качестве обходного пути я хочу закрыть диалог и заставить их снова ввести путь к файлу. Однако проблема в том, что SaveFileDialog не имеет подпрограммы Close() или чего-либо еще, что я вижу, чтобы закрыть ее. Как я могу закрыть диалог программно?

// error only seems to occur if a filter is specified.
var dialog = new Microsoft.Win32.SaveFileDialog 
{ 
    Filter = "My juicy file (*.mjf) | *.mjf" 
};

try
{
    dialog.ShowDialog();
}
catch (System.IO.PathTooLongException error) // handle
{
    /*
        * if I handle this exception (by displaying a message to the user)
        * the dialog will remain open, but if the user attempts to use it
        * and enter another filename a mixture of the following exceptions
        * are raised:
        * 
        * AccessViolationException
        * FatalExecutionEngineError
        * ExecutionEngineException
    */

    MessageBox.Show(error.Message);
}

EDIT

Спасибо за ваши ответы / комментарии. Я только что проверил это на моем Windows 7, и он ведет себя как ожидалось, так что это может быть проблема только в XP.

Ответы [ 3 ]

1 голос
/ 15 августа 2011

В WPF 4.0 в Windows 7 SaveFileDialog показывает свой собственный диалог ошибок:

<long path?
The path is too long.
Try a shorter name.

с кнопкой ОК, чтобы закрыть диалоговое окно ошибок.Это возвращает пользователя к исходному SaveFileDialog, где он может изменить свое значение или Отмена.

Для более ранних версий, где поведение может отличаться, вы можете использовать Windows UI Automation framework to программно нажмите кнопку "Отмена" на SaveFileDialog.

0 голосов
/ 15 августа 2011

Отправить окну сообщение WM_SYSCOMMAND с параметром wParam SC_CLOSE.Это эквивалент нажатия кнопки «Закрыть» в правом верхнем углу диалогового окна.

0 голосов
/ 15 августа 2011
if (dialog != null)
{
    dialog.DialogResult = DialogResult.Cancel;
}

Попробуйте установить результат диалога, чтобы закрыть его.

...