none
webview事件响应问题 RRS feed

  • 问题

  • 很疑问的一个问题:将一个webview放置在我的应用里面,点击webview任何位置,所有事件都会被webview的网页接收。可是如果安装一个软件,比如手势软件,你在网页上面点击滑动,却可以响应,不被网页接收。这是为什么??

    如何我想让webview响应我的鼠标事件,而不被网页接收,该如何做呢??

    我查过一些资料,用ScriptNotify可以让网页回调事件,可以做到我想要的效果,可是我的网页存储在appdata下面,位于:Windows.Storage.ApplicationData.Current.LocalFolder,如果想让放于这里的网页正常显示的话,必须使用Navigate,Uri前面需要加上"ms-appdata:///local/"才能够正常显示,可是这种方式却不支持ScriptNotfiy。然后我改为NavigateToLocalStreamUri这种方式去显示,能够响应ScriptNotify,可是网页却不能够正常显示,尤其是图片。。急求解决方案。

    2013年9月17日 3:42

答案

  • 你好,因为win8.1未对外正式公布,所以目前中文论坛暂时不支持对win8.1新功能的支持,支持将从10月中旬开始。

    不过你可以就这个问题到http://social.msdn.microsoft.com/Forums/en-US/home?forum=w81prevwCsharp 论坛去提问,会有专门负责win8.1的人员来帮助你解决问题。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 柳天赐 2013年9月23日 8:54
    2013年9月23日 7:43
    版主

全部回复

  • Hi,

    安装一个软件是什么意思,你是指在Windows store app里面装一个软件?

    如果你想要webview响应鼠标事件而不被网页接受,以下有两种方案您可以考虑:

    1. 可以直接使用WebViewBrush 加载网页内容。

    2. 可以对WebView做Javascript Inject的操作,把下面这段代码注入到Javascript中

    string InsertionScriptString = "function disableLink() { ";
    InsertionScriptString += "var links = document.links, i, length;";
    InsertionScriptString += "for (i = 0, length = links.length; i < length; i++) {";
    InsertionScriptString += "links[i].disabled ='true';}}";

    同时,通过下面的代码把功能注入进去:

    webview.InvokeScript("disableLink", null);

    祝您好运!


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.



    2013年9月18日 2:47
    版主
  • 我的网页是交互式的,不能够使用WebViewBrush。

    用第二种方式对于这种存放在application data下面的网页行不同,因为存放在application data下面的网页需要使用ms-appdata///local/来引用,查看msdn说,ScripyNotify对于ms-appdata///local/不支持,只支持ms-appx-web或则文件流。如果我通过文件流来显示application data下面的网页,图片显示不正常。明白我说的了吗?

    2013年9月18日 7:53
  • Hi,

    您第一个帖子说网页不响应鼠标事件,第二个帖子却说网页是互交的,那么不响应事件如何做到互交,所以我对本帖的理解是:你的页面仅仅用来展示,而通过ScripyNotify获取页面的信息。

    所以基于这个理解,我的想法是你可以建立一个WebViewBrush用来展示,一个隐藏的WebView作为互交,你觉得这个能满足你的要求么?

    另外我想知道的是你从哪里的MSDN文档上看到ScripyNotify不支持ms-appdata///local/的,我查看了下文档ScriptNotify event 我查看了下文档并没有看到有关于不支持的说法,仅仅只有在WebView的页面上说:WebView does not support the ms-appdata scheme, although it does support the ms-appx-web scheme, which you can use to load content files from your app package。

    我们的MSDN blog上有一篇文档:http://blogs.msdn.com/b/wsdevsol/archive/2012/10/18/nine-things-you-need-to-know-about-webview.aspx 你可以参看下第五条,里面的例子用的就是存放在本地的HTML文档,图片的话我试过,是可以显示的,另外ScripyNotify的功能也是可以实现的。

    我这里上传一个例子到Skydrive希望你可以参考:http://sdrv.ms/16kEBC9 

    Best Regards,


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月18日 9:08
    版主
  • 网页必须是存储在application data下面,不是appx下面。就是这个位置:Windows.Storage.ApplicationData.Current.LocalFolder。。。存放在你那个位置确实是可行的。

    你可以尝试将网页放到C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState

    这是应用程序的私有空间。只用通过Navigate("ms-appdata///local/xxxx/xxx.html")才能够正常显示,你可以试试。

    而用了ms-appdata这种方式的话,ScriptNotify没有任何响应。你也可以尝试下。如果你有QQ的话,加我QQ交流下:2519576065,谢谢啦!!!

    2013年9月18日 9:54
  • Hi 柳天赐,

    在代码里面有这么一段话,不知道您注意到没有,你可以尝试把HTMLPage1.html放在C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState下面,然后comment掉read from project这段话,运行read from local folder,再试一下代码。代码运行时,点击WebView中的UpdateTime按钮可以看到下面的TextBox内容跟着变化了,也就是说ScriptNotify事件被激活了。

    //read from local folder
    //Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/HTMLPage1.html"));
    
    //read from project
    Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///HTMLPage1.html"));
    

    Best Regards,

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月19日 1:13
    版主
  • 首先请将HTMLPage1.html从工程中移除,然后放置到application data下面,在运行工程,这个代码段根本是运行不了得:Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///HTMLPage1.html"));
    2013年9月22日 1:20
  • Hi 这位同学,你应该运行这段话:Windows.Storage.StorageFile MyWebPageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/HTMLPage1.html"));
    这段话才是从
    C:\Users\你的用户\AppData\Local\Packages\你项目的package name\LocalState这个地址读取HTML文件。

    如果你把HTML文件从工程中移除,new Uri("ms-appx:///HTMLPage1.html")是肯定找不到目标文件的。


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月23日 1:20
    版主
  • 所以我们又回到了原点。。。我开始说了,我的网页是存放在application data下面。不存在工程文件里面。。。用ms-appx是不可以访问的,只可以用ms-appdata///local/,而用这个方式访问网页的话,ScripyNotify是不可以使用,你可以试试。。
    2013年9月23日 2:02
  • OK,我又仔细看了下我们的回复,我知道我们的误会在哪里,可能是我没有讲清楚,抱歉。

    你的意思是直接通过webview.Navigate(new Uri("ms-appdata:///local/HTMLPage1.html"))的方式来加载页面,如果是直接Navigate的确是不可行。我说的方式是先通过GetFileFromApplicationUriAsync方式获取文件,然后用webview.NavigateToString(MyWebPageString)的方式来显示页面,这种方式类似于把HTML代码读出来然后在WebView中展示,是可以ScripyNotify的。

    不过我还是没能明白你想要做的,一方面不想让鼠标与网页互交,一方面又想使用ScripyNotify,你的意思是通过键盘方式来触发?还是说通过InvokeScript的方式来触发某些事件然后ScripyNotify获取返回值?如果是这样的话你可以前台做个WebViewBrush用来展示,外加一个隐藏的webView来响应你的事件。


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月23日 2:20
    版主
  • 我重新讲下我的需求:我的程序通过网络将一些交互式的网页下载到application data下面。然后我想用全屏的webview将网页显示出来,正常显示。。。。然后我想获取一些事件,比如鼠标拖动事件。不想被网页给接收。类似遨游浏览器的手势并不会被网页接收似的。

    目前用webview.Navigate(new Uri("ms-appdata///local/HTMLPage1.hmtl"))是可以正常将网页显示的,但是却不可以使用ScripyNotfiy这个网页回调功能。如果使用你说的NavigateToString函数的话,不太可行,因为我的网页包含了很多其他js,css和其他网页网页等。。。也不想用WebViewBrush来显示,因为这样的话,我的网页里面的输入框就不可输入了。。

    明白吗??有解决方案吗?

    2013年9月23日 2:55
  • Hi 柳天赐

    在WinRT中webview功能没有那么强大,所以我觉得你的想法不太可行。 不过我觉得如果你用WinJS来做项目的话倒是有可行度。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月23日 3:06
    版主
  • 所以我想用NavigateToLocalStreamUri去显示application data下面的网页,因为这个是支持ScripyNotify,可是用这个网页显示不正常,尤其是图片。不知道你有什么好的方法让我可以获取webview的事件呢??我目前做法就是将从网络下载的网页下载到install目录的appx下面。感觉这种方法好别扭,因为这个目录本来是说不可写的,我利用它的一个参数强行写入。
    2013年9月23日 3:33
  • 你好,因为win8.1未对外正式公布,所以目前中文论坛暂时不支持对win8.1新功能的支持,支持将从10月中旬开始。

    不过你可以就这个问题到http://social.msdn.microsoft.com/Forums/en-US/home?forum=w81prevwCsharp 论坛去提问,会有专门负责win8.1的人员来帮助你解决问题。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 柳天赐 2013年9月23日 8:54
    2013年9月23日 7:43
    版主
  • 公司在开发win8.1的产品,win8.1的好多功能都不行呀。都要绕着弯子做。。累死人啦!!公司项目都比较赶,不可能等到win8.1更新,就太慢了。
    2013年9月23日 8:29
  • <FlipView>

    </FlipView>

    <webview />

    有这样的结构,webview覆盖在flipview上面,开始的时候webview是显示的, flipview是隐藏的,我想实现手势左右滑动的时候,隐藏webview,然后flipview能够响应左右滑动效果。

    有解决方案吗?

    2013年9月23日 9:01