C# Windows Phone 8.1-通过外部ScrollViewer元素处理WebView垂直滚动 问题
我必须在Windows Phone 8.1应用程序中的C# Windows Phone 8.1-通过外部ScrollViewer元素处理WebView垂直滚动 问题,c#,xaml,webview,windows-phone,windows-phone-8.1,C#,Xaml,Webview,Windows Phone,Windows Phone 8.1,我必须在Windows Phone 8.1应用程序中的ScrollViewer中显示WebView,并满足以下要求: WebView高度应根据其内容进行调整 WebView垂直滚动应由外部ScrollViewer处理 WebView应处理水平滚动、缩放(收缩缩放)、文本选择(使用默认的复制按钮)和链接导航 下图是我的模拟布局(左侧)和类似功能的最佳示例-这将是一个内置邮件应用程序(右侧) XAML布局示例: <ScrollViewer> <Grid Margin="1
ScrollViewer
中显示WebView
,并满足以下要求:
WebView
高度应根据其内容进行调整李>
WebView
垂直滚动应由外部ScrollViewer
处理WebView
应处理水平滚动、缩放(收缩缩放)、文本选择(使用默认的复制按钮)和链接导航<ScrollViewer>
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<TextBlock Text="My content" />
</Grid>
<WebView Grid.Row="1" x:Name="WebViewComponent"></WebView>
</Grid>
</ScrollViewer>
我试了什么
-此部件工作,经过几次调整,我能够为WebView
元素设置正确的高度
-不起作用。这里的问题是,在Windows Phone 8.1中,WebView
组件似乎没有可视子对象(至少没有DependencyObject
)
我也尝试过使用manuOpulationMode
和ishitetVisible
属性,但没有成功
更新
将文本选择和复制按钮添加到所需的
WebView
功能中。在最初的问题内容中,不知何故遗漏了它。您是否尝试过将WebView的Height属性设置为Auto
<ScrollViewer x:Name="scrollViewer" >
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="My content" />
<Grid Background="Transparent"
Margin="0"
Grid.Row="1">
<WebView ScrollViewer.ZoomMode="Enabled"
x:Name="WebViewComponent"
Margin="0"
Height="Auto" />
</Grid>
</Grid>
</ScrollViewer>
我检查了它并尝试了一些方法,但无法按您想要的方式工作。想出一个不同的设计可能更容易。基本上,不包括外部
ScrollViewer
的东西
- 一个选项(可能有点黑客,还没有测试过)是通过一些JS将内容注入页面,只使用
WebView
- 如果您的内容很小,您可以将其放在页面顶部,移除
,让ScrollViewer
处理所有内容。WebView
将更小,但工作正常WebView
这些只是不同设计的一些例子。如果你告诉我为什么它们不起作用,或者如果你给我更多关于你的实际问题的信息,我可能会想出更合适的方法。我一直面临这个问题,我得到了一些部分解决方法(不包括文本选择) 基本上,为了能够使用包含webview的scrollviewer,您需要拖动一些东西,因此我使用了一个高度和宽度与webview相同的矩形
<ScrollViewer Name="ScrollViewer">
<Grid x:Name="LayoutRoot" Height="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Name="GridHeader">
<Image Stretch="UniformToFill" Source="ms-appx:///Assets/img_default_header.jpg" />
</Grid>
<Grid Grid.Row="1" x:Name="GridNews" Margin="12,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<WebView Margin="-6,12,0,-6" Grid.Row="0" x:Name="WebviewContent" VerticalAlignment="Top" DefaultBackgroundColor="Transparent" />
<Rectangle Margin="0,12,0,0" Height="{Binding Height, ElementName=WebviewContent}" Name="RecWeb" VerticalAlignment="Top" Fill ="#00000000" Tapped="RecWeb_Tapped" />
</Grid>
<Grid Name="GridRelatedNews" Grid.Row="2" Margin="12,0">
<ListView ItemsSource="{Binding NewsDetail.RelatedStory}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
</ListView>
</Grid>
</ScrollViewer>
我设法允许此解决方案能够使用此方法(loadLink javascript方法)单击内容中的某个链接:
也许您可以从这里开始为您的选择文本问题添加一个事件处理程序。使用此解决方案的目的还在于在javascript中找到一个等效的事件处理程序。我认为Auto是
WebView.Height
属性的默认值,尽管我现在这样做了。完全没有效果。另外,ScrollViewer.ZoomMode=“Enabled”
不会影响内部浏览器的滚动。只是出于好奇,您是否尝试只注入一些css来禁用overflow:scroll,以便您的ScrollViewer能够真正执行其工作。什么样的?我希望我现在有更多的空闲时间去玩它,不管怎样,这似乎是一个普遍的问题。@Chris我做了WebView
完全捕获指针交互,并以类似“压缩”滚动的方式进行反应(不确定这是否是一个合适的术语-滚动速度非常慢,一旦松开手指就会恢复)。有点像“一个滚动来滚动所有指针”问题:)问题是屏幕顶部显示的内容可能很复杂,包含图像、按钮等。很抱歉,我似乎不知何故错过了原始问题帖子中的这一部分。我意识到在网络视图中包含所有内容是可能的,但这需要付出很大的努力。无论如何,谢谢你的邀请suggestion@danyloid是的,复杂的内容使它。。。复杂:)还有两个想法:1)使用Pivot,一个页面上的内容,另一个页面上的webview;2) 类似垂直轴的东西-你可以看到底部的webview,一旦你点击它,它几乎会全屏显示,顶部只有一些小东西,你可以从中返回到其他内容。谢谢,我没有考虑第二种方法。这可能不是最好的解决办法,尽管这是一个很好的选择。谢谢。我想这是最接近的一个。这是@tdmanutd解决方案的完整实现,我也面临同样的问题。我试试这个解决方案。谢谢你的帖子。@Ouadie LoadLink函数对我不起作用。链接未被单击。你有什么想法吗?@LovetoCode首先你必须检查你是否正确调用等待这个.WebviewContent.InvokeScriptAsync(“loadLink”,size)
然后在javascript中使用警报
或控制台进行检查。记录
您是否正确收到了加载链接
调用。
string htmlFragment = @"
<html>
<head>
<meta name=""viewport"" content=""width="+width+@", initial-scale=1, user-scalable=no"" />
<script type=""text/javascript"">
function loadLink(x,y){
window.external.notify('x='+x+'y='+y);
var el = document.elementFromPoint(x, y);
el.click();};
</script>
<style>
" + CSS + @"
</style>
</head>
<body onLoad=""window.external.notify('rendered_height='+document.getElementById('content').offsetHeight);"">
<div id='content' style=""font-size:16px; color:#222222;"">" + original +
@"</div>
</body>
</html>";
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;
}
}
}
private async void RecWeb_Tapped(object sender, TappedRoutedEventArgs e)
{
Point p = e.GetPosition(WebviewContent);
int x = Convert.ToInt32(p.X);
int y = Convert.ToInt32(p.Y);
string[] size = { x.ToString(), y.ToString() };
await WebviewContent.InvokeScriptAsync("loadLink",size);
}