Как выполнить асинхронные вызовы как синхронизацию
Я новичок в 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;