Как выполнить асинхронные вызовы как синхронизацию

Я новичок в C# и Xamarin. Я чувствую, что было бы какое-то быстрое решение для достижения этой цели, но я уже потратил день, чтобы найти его. Пожалуйста, дайте мне подсказку, чтобы я мог двигаться в правильном направлении.

Метод заключается в изменении размера окна после получения высоты и ширины. Проблема заключается в GetWidth() а также GetHeight() работает в асинхронном режиме, в то время как основной поток устанавливает Window.SetFrame(...)следовательно, я не могу изменить размер окна.

Я думаю, что одним из решений является каскадирование и установка оконной рамы в самом внутреннем блоке.

private void ResizeWindow() 
{
    _webView.EvaluateJavaScript("document.readyState",
                                    (complete, error) =>
        {
            if (complete != null)
            {
                GetHeight();
                GetWidth();

                CGRect windowRect = Window.Frame;
                windowRect.Size = new CGSize(_width, _height);
                Window.SetFrame(windowRect,true);
        }
    });
}

    private void GetWidth()
    {

        _webView.EvaluateJavaScript("document.body.scrollWidth",
                                    (scrollWidth, wError) =>
        {
            if (scrollWidth != null && nfloat.TryParse(scrollWidth.ToString(), out nfloat value))
            {
                _width = value;
            }
        });

    }

    private void GetHeight()
    {
        _webView.EvaluateJavaScript("document.body.scrollHeight",
                                   (scrollHeight, hError) =>
        {
            if (scrollHeight != null && nfloat.TryParse(scrollHeight.ToString(), out nfloat value))
            {
                _height = value;
            }

        });
    }

1 ответ

Xamarin.iOS уже есть TaskCompletionSourceобертка для WKWebView.EvaluateJavaScript,

Так что вы можете просто await призыв к EvaluateJavaScriptAsync для NSValueна основе результата, а затем преобразовать его в тип значения C#.

Поскольку я знаю, что выполняемый javascript возвращает число, я могу разыграть NSObject возврат (это на самом деле NSValue) к NSNumber и получить C# long от него.

Пример:

var result = await webview.EvaluateJavaScriptAsync("document.body.scrollWidth");
var width = (result as NSNumber).Int64Value;
result = await webview.EvaluateJavaScriptAsync("document.body.scrollHeight");
var height = (result as NSNumber).Int64Value;
Другие вопросы по тегам