CefSharp IJsDialogHandler.OnBeforeUnloadDialog и поток пользовательского интерфейса - PullRequest
0 голосов
/ 22 февраля 2020

Мой код для 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;
...