我在listBox中有多个webbrowser控件(Hierarchy:DataBoundListBox-> Multiple ExpandableItems->每个可展开项目在扩展时显示webbrowser控件。)。
问题是,webbrowser控件捕获拖动手势,一旦webbrowser控件展开,就无法滚动列表框。如果web浏览器的内容太长,则当web浏览器填满整个屏幕时,用户卡住并且不能再滚动。现在,webbrowser只需要响应简单的点击事件(按钮)。
webbrowser控件在内部捕获所有触摸手势和事件,但似乎有一个border
元素,触摸事件可以在触摸手势到达tilehost
之前被截获并且永远消失:< / p>
Border border = WebViewer.Descendants<Border>().Last() as Border;
为了捕捉触摸手势,我向边框添加了一个ManipulationDelta事件,因为它不允许我添加像DragStarted
,DragDelta
,DragCompleted
这样的手势监听器事件。
现在我需要将此ManipulationDelta事件数据传送到浏览器所在的列表框内的scrollviewer。
这是一种有效的概念方法,是否有人能够帮助我如何运行?
PS:我反过来尝试过(将画布覆盖中的点击手势事件发送到webbrowser控制页面内的javascript并模拟页面上的点击)但这似乎不能很好地作为触摸坐标并且javascript坐标有一个未知的偏移量。
感谢您的帮助!
答案 0 :(得分:1)
事实证明,使用javascript的最后一个方法实际上工作得很好,问题是传递给javascript的双x和y值。在将其转换为整数后,它检测到底层html元素像素精确。
如果您想知道如何将点击事件传输到webbrowser元素中的网站,您需要执行以下操作:
将“LinqToVisualTree”添加到您的项目和文档中(f.e。:使用LinqToVisualTree;)!
将此javascript代码添加到您的网站(除了jquery):
function simulateClick(x, y) {
jQuery(document.elementFromPoint(x, y)).click();}
将Silverlight工具包(搜索GestureService for info)添加到您的解决方案中,并将此事件添加到XAML文件中的覆盖画布(放置在webbrowser元素上的canvas元素)中(例如,请注意我放入的画布)你必须用自己的画布或网格或其他任何东西替换它:
<Canvas>
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Tap="GestureListener_Tap"/>
</toolkit:GestureService.GestureListener>
</Canvas>
将此添加到您的xaml文件codebehind c#(请注意我从点击中重新计算了原始坐标,您可能需要更改数字1.3499。这是模拟器上按钮的静态偏移系数。) :
private void GestureListener_Tap(object sender, Microsoft.Phone.Controls.GestureEventArgs e)
{
Canvas cv = sender as Canvas;
//!!! You need to change the following search for the webbrowser to your own xaml structure.
// It uses "LinqToVisualTree" to find the element! Add it to your document!
WebBrowser wb = cv.Ancestors<Grid>().First().ElementsBeforeSelf<WebBrowser>().First() as WebBrowser;
var gesture = e.GetPosition(cv);
var gx = gesture.X;
var gy = gesture.Y;
tapBrowser(wb, gx, gy);
}
private static void tapBrowser(WebBrowser wb, double x, double y)
{
GeneralTransform gt = wb.TransformToVisual(Application.Current.RootVisual as UIElement);
Point offset = gt.Transform(new Point(0, 0));
double rx = (x / 1.3499);
double ry = (y / 1.3499);
int ix = (int)rx;
int iy = (int)ry;
wb.InvokeScript("simulateClick", ix.ToString(), iy.ToString());
}
确保您的画布与webbrowser元素的大小相同!
多数民众赞成。您现在有一个启用了tap的浏览器,但您可以将其余的手势保留在本机应用程序中,浏览器将无法捕获它们!从理论上讲,你可以重定向更多的手势,但你需要有一个javascript / jquery函数,它可以“重新模仿”你要传递的手势。