具有WebView单元格的ListView未正确呈现

具有WebView单元格的ListView未正确呈现,listview,webview,xamarin.forms,Listview,Webview,Xamarin.forms,我试图使用一个ListView控件,该控件使用一个ItemTemplate,其中包含一个WebView。页面将加载一组聊天气泡(聊天气泡的内容是HTML) 现在所有的代码都工作正常,但是渲染有点不正常 问题1。 如果我不添加Task.Delay所有单元格都将呈现在彼此下方。与单元格高度的重新计算有关。 有办法摆脱这个吗 问题2。 当所有聊天泡泡都已加载且总内容高度大于屏幕时,ListView仍不会滚动。。。使用触摸操作列表视图,它通常会重新绘制,此时滚动正常 所有这些感觉就像我需要等待所有渲染完

我试图使用一个
ListView
控件,该控件使用一个
ItemTemplate
,其中包含一个
WebView
。页面将加载一组聊天气泡(聊天气泡的内容是HTML)

现在所有的代码都工作正常,但是渲染有点不正常

问题1。 如果我不添加
Task.Delay
所有单元格都将呈现在彼此下方。与单元格高度的重新计算有关。 有办法摆脱这个吗

问题2。 当所有聊天泡泡都已加载且总内容高度大于屏幕时,
ListView
仍不会滚动。。。使用触摸操作
列表视图
,它通常会重新绘制,此时滚动正常

所有这些感觉就像我需要等待所有渲染完成,然后以某种方式重新绘制页面。 有人试过这样做吗

这里有一些项目的代码,如果需要我可以发布更多

列表视图:

<ListView x:Name="ChatListView"
          ItemsSource="{Binding Chats}"
          HasUnevenRows="true">
    <ListView.Margin>
        <OnPlatform x:TypeArguments="Thickness" iOS="0,30,0,0" />
    </ListView.Margin>      
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <WebView Source="{Binding Content, Converter={StaticResource HTMLConverter}}" HeightRequest="10" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
" }; Device.beginInvokeMainThread(异步()=> { 添加(聊天用户); 等待任务。延迟(50); 添加(chatServer); 等待任务。延迟(50); 添加(chatUser2); 等待任务。延迟(50); }); } 自定义iOS WebView渲染器:

public void LoadData()
{
    ChatMessage chatUser = new ChatMessage()
    {
        Name = "Glenn Versweyveld",
        Date = DateTime.Now,
        Subject = "Onvoldoende beschikbaar",
        Content = @"<dl><dt>Definition list</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd><dt>Lorem ipsum dolor sit amet</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd></dl>"
    };

    ChatMessage chatServer = new ChatMessage()
    {
        Name = "HelpDesk",
        Date = DateTime.Now,
        Subject = "Onvoldoende beschikbaar",
        Content = @"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>"
    };

    ChatMessage chatUser2 = new ChatMessage()
    {
        Name = "Glenn Versweyveld",
        Date = DateTime.Now,
        Subject = "Onvoldoende beschikbaar",
        Content = @"<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=""#"">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a { display: block; width: 300px; height: 80px; }</code></pre>"
    };

    Device.BeginInvokeOnMainThread(async () =>
    {
        Chats.Add(chatUser);
        await Task.Delay(50);
        Chats.Add(chatServer);
        await Task.Delay(50);
        Chats.Add(chatUser2);
        await Task.Delay(50);
    });
}
public class CustomWebViewRenderer : WebViewRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        UIWebView uiWebView = ((UIWebView)NativeView);
        Delegate = null;

        uiWebView.DataDetectorTypes = UIDataDetectorType.None;
        uiWebView.ScalesPageToFit = false;
        uiWebView.ScrollView.ScrollEnabled = false;
        uiWebView.LoadFinished += OnLoadFinished;

        base.OnElementChanged(e);
    }

    protected override void Dispose(bool disposing)
    {
        var control = ((UIWebView)NativeView);
        control.LoadFinished -= OnLoadFinished;
        Delegate = null;

        base.Dispose(disposing);
    }

    private void OnLoadFinished(object sender, EventArgs e)
    {
        var control = ((UIWebView)NativeView);

        string contentHeight = control.EvaluateJavascript("document.getElementById('mybody').offsetHeight");
        double height;
        if (double.TryParse(contentHeight, out height))
            height += 8;
        else
            height = 350;

        ((WebView)Element).MinimumHeightRequest = height;
        ((WebView)Element).HeightRequest = height;
    }
}