如何将异步呼叫作为同步运行

时间:2018-07-25 09:43:07

标签: c# macos cocoa xamarin wkwebview

我是C#和Xamarin的新手。我觉得有一些快速的解决方案可以实现这一目标,但是我已经花了一天的时间找到一个解决方案。请给我一个提示,以便我朝正确的方向前进。

方法是在获取“高度和宽度”后调整窗口大小。问题是GetWidth()GetHeight()在异步模式下运行,而主线程设置了Window.SetFrame(...),因此我无法调整窗口大小。

我认为一种解决方案是在最里面的块中级联并设置Window框架。

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 个答案:

答案 0 :(得分:1)

Xamarin.iOS已经有TaskCompletionSource的基于WKWebView.EvaluateJavaScript的包装器。

因此,您可以await调用EvaluateJavaScriptAsync以获得基于NSValue的结果,然后将其转换为C#值类型。

由于我知道正在运行的javascript返回数字,因此我可以将NSObject返回(实际上是NSValue)转换为NSNumber并获得C#{{1} }。

示例:

long