Windows Phone 8.1 – 通过外部ScrollViewer元素处理WebView垂直滚动

问题

我必须在Windows Phone 8.1应用程序中的ScrollViewer中显示WebView ,具有以下要求:

  1. 应根据其内容调整WebView高度。
  2. WebView垂直滚动应由外部ScrollViewer处理。
  3. WebView应处理水平滚动,缩放(缩放缩放),文本选择(使用默认复制按钮)和链接导航。

在下面的图片是我的模拟布局(左侧)和类似function的最佳示例 – 这将是一个内置的邮件应用程序(在右侧)

我的页面布局(左侧)和类似功能的示例(右侧)

示例XAML布局:

             

我尝试了什么

测量HTML内容并调整WebView高度 – 这部分工作 ,通过几次调整,我能够为WebView元素设置正确的高度。

订阅WebView中的Border元素 – 没有用 。 这里的问题是,在Windows Phone 8.1中,似乎WebView组件没有可视子元素(至少不是DependencyObject的)

我也尝试过使用ManupulationModeIsHitTestVisible属性但没有成功

更新为所需的WebViewfunction添加了文本选择和复制按钮。 不知何故在原始问题内容中错过了它。

我一直面临这个问题,部分解决了一些问题(不包括文本选择)。

基本上,为了能够使用包含webview的滚动查看器,你需要拖动一些东西,所以我使用一个高度和宽度与webview相同的矩形。

                        

现在我们需要注入一些css和javascript来使webview高度适应内容(我在另一个stackoverflow线程上找到了一些代码示例,忘记跟踪它来自哪里)

 string htmlFragment = @"        
" + original + @"
";

然后添加webview webscript通知事件以确定webview(和矩形)的渲染高度:

 void WebviewContent_ScriptNotify(object sender, NotifyEventArgs e) { if (e.Value.Contains("rendered_height")) { if (valuePair != null && valuePair[0] == "rendered_height") { double renderedHeight = double.Parse(valuePair[1]); WebviewContent.Height = renderedHeight; } } } 

我设法允许此解决方案能够使用此方法(loadLink javascript方法)单击内容中的某些链接:

 private async void RecWeb_Tapped(object sender, TappedRoutedEventArgs e) { Point p = e.GetPosition(WebviewContent); int x = Convert.ToInt32(pX); int y = Convert.ToInt32(pY); string[] size = { x.ToString(), y.ToString() }; await WebviewContent.InvokeScriptAsync("loadLink",size); } 

也许你可以从那里为它添加一个事件处理程序,用于选择文本问题。 使用此解决方案的要点也是在javascript中查找等效的事件处理程序。

我检查了一下,尝试了一些东西,但无法按照你想要的方式使它工作。 提出不同的设计可能更容易。 基本上,不包括外部ScrollViewer

  • 一个选项(可能有点hacky,尚未测试)是通过一些JS将内容注入页面,并仅使用WebView

  • 如果您的内容很小,您可以将其保留在页面顶部,删除ScrollViewer并让WebView处理所有内容。 WebView将更小,但它可以正常工作。

这些只是不同设计的一些例子。 如果你告诉我他们为什么不工作,或者你给我更多关于你实际问题的信息,我可能会想出一些更合适的东西。

您是否尝试将WebView的高度属性设置为自动?