Мой код для IJsDialogHandler.OnBeforeUnloadDialog
таков:
bool IJsDialogHandler.OnBeforeUnloadDialog(IWebBrowser browserControl, IBrowser browser, string message, bool isReload, IJsDialogCallback callback)
{
DialogResult dialogResult = MessageBox.Show(
"Do you want to save your work?",
"Unsaved changes",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning
);
callback.Continue(dialogResult == DialogResult.No);
return true;
//Custom implementation would look something like
// - Create/Show dialog on UI Thread
// - execute callback once user has responded
// - callback.Continue(true);
// - return true
//NOTE: Returning false will trigger the default behaviour, no need to execute the callback if you return false.
//return false;
}
Я включил исходные заметки, в которых говорится, что мой диалог должен выполняться в потоке пользовательского интерфейса.
Однако это код работает нормально.
Итак, действительно ли это поток пользовательского интерфейса, на котором выполняется этот код? Нет необходимости использовать Invoke
или другой код?
РЕДАКТИРОВАТЬ: Теперь у меня есть простая веб-страница с обработчиком textarea и onbeforeunload js:
<script type="text/javascript">
window.onbeforeunload = function() {
return 'Save';
}
</script>
<textarea></textarea>
и я использую:
bool IJsDialogHandler.OnBeforeUnloadDialog(IWebBrowser browserControl, IBrowser browser, string message, bool isReload, IJsDialogCallback callback)
{
var control = (Control)browserControl;
control.BeginInvoke(new Action(() =>
{
DialogResult dialogResult = MessageBox.Show(
"Do you want to save your work?",
"Unsaved changes",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning
);
callback.Continue(dialogResult == DialogResult.No);
}));
return true;
}
Если пользователь решит остаться, я больше не могу нажимать внутри текстовой области для ввода (курсор не появляется), но если я сверну свое приложение и восстановлю его, Затем я могу щелкнуть внутри текстовой области.
EDIT2: Вот рабочий код для диалогового окна пользовательской формы после amaitland
комментариев:
var control = (Control)browserControl;
control.BeginInvoke(new Action(() =>
{
using (var frm = new Form2())
{
var result = frm.ShowDialog();
callback.Continue(result == DialogResult.OK);
}
control.Focus(); // after callback.Continue
}));
return true;