浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

原文:浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx

本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的ContextMenu。

先来看看在WinForm中是如何实现的:

Code
public void ShowContextMenu(

            MsHtmlCustomization.ContextMenuTarget dwContext,

            ref MsHtmlCustomization.POINT pPoint,

            MsHtmlCustomization.IOleCommandTarget pCommandTarget,

            object HTMLTagElement)

{

  Point p = new Point(pPoint.x, pPoint.y);

  p = PointToClient(p);

  myCustomContextMenu.Show(this, p);  //myCustomContextMenu是一个System.Windows.Forms.ContextMenu对象。

  const int Ok = 0;

  throw new COMException("", Ok); // return HRESULT = S_OK, so MsHtml

 

                                  // doesn’t display its own menu

 

 

先来看看网上一般的实现方法:

myHostBrowser.ContextMenu.PlacementTarget = this;//this即自己的Windows对象,它实现了IDocHostUIHandler接口。

myHostBrowser.ContextMenu.IsOpen = true;

通过此方法可以实现自己控制弹出菜单,比如在某个控件上左击弹出快捷菜单的功能。但是针对这里的WebBrowser控件来说情况就有些不同了,应为WebBrowser是对系统的Internet explorer对象进行了封装,使其处理所有的事件,所以介于WinForm和WPF对ContextMenu对象实现的不同,比如WinForm实现ContextMenu对象的Show方法时,它把菜单的显示委托给了底层的Usr32函数:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]

public static
extern bool TrackPopupMenuEx(HandleRef hmenu, int fuFlags, int x, int y, HandleRef hwnd, NativeMethods.TPMPARAMS
tpm);

而WPF实现的ContextMenu则采用了新的方法,所以在网上可以看到不少讲解利用ContextMenu实现嵌入许多控件的方法,以丰富其功能的文章。

所以造成的结果就是在ShowContextMenu中弹出WPF的ContextMenu时,第一次可以弹出正确的菜单,但第二次在WebBrowser中右击时菜单会消失,但ShowContextMenu将不会被触发。而在第三次右击时菜单才会弹出。

那我想到的就是将WinForm中的ContextMenu嵌入到WPF中使用,这是只要解决一个问题即可,就是在Show是传入一个Control对象即可,

参考MSDN文章:How
to: Enable Visual Styles in a Hybrid Application




Code
 

System.Windows.Forms.TextBox tc;

        private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            System.Windows.Forms.Application.EnableVisualStyles();

 

            // Create a WindowsFormsHost element to host

            // the Windows Forms control.

            System.Windows.Forms.Integration.WindowsFormsHost host =

                new System.Windows.Forms.Integration.WindowsFormsHost();

 

            // Create a Windows Forms tab control.

            tc = new System.Windows.Forms.TextBox();//此TextBox只是为了显示ContextMenu而构造的一个任意对象。

            // Assign the Windows Forms tab control as the hosted control.

            host.Child = tc;

 

            // Assign the host element to the parent Grid element.

            this.grid2.Children.Add(host);




 

而在ShowContextMenu中则写上:

System.Windows.Forms.ContextMenu menu
= new System.Windows.Forms.ContextMenu();

menu.MenuItems.Add(new System.Windows.Forms.MenuItem("Test"));

System.Drawing.Point p = new System.Drawing.Point(ppt.x, ppt.y);

p
= tc.PointToClient(p);

menu.Show(tc, p);

即可显示自己的定制的ContextMenu。

时间: 2024-09-27 04:42:40

浏览器扩展系列————在WPF中定制WebBrowser快捷菜单的相关文章

浏览器扩展系列————透明浏览器窗口的实现

原文:浏览器扩展系列----透明浏览器窗口的实现 首先先看一下效果图:     本实现是基于WPF,VS版本2008 SP1.     先说一下在Winform中的实现方法:很简单通过设置窗体的opacity来实现,或者还可以设置TransparentKey来实现某种颜色透明.但是在WPF中则如何实现呢? 通过设置窗体的opacity,那么得到结果就是webbrowser整体消失了.因为这里面涉及到WPF中"空域"的问题,相关的文章如下: http://blogs.msdn.com/c

浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合:          在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在html的脚本中使用自己在.net中定义的类,实现与Internet Explorer server的互操作.此外也可以在充分利用html在设计界面方面高效,简单的同时,也可以实现一些复杂的特性. 实现: Codepublic class ScriptEvent     {     

求WPF中关于WebBrowser详细的官方文档。

问题描述 这个网站只是WebBrowser而已https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(System.Windows.Controls.WebBrowser);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.0);k(DevLang-csharp)&rd=trueWebBrowser.Document属性中就一句话:需要将

WPF中嵌入WinForm中的webbrowser控件

原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能使用.决定还是使用WinForm中的webbrowser.要想在WPF中使用WinForm控件,查看MSDN,需经过以下步骤. 创建名为 HostingWfInWpf 的 WPF 应用程序项目. 在解决方案资源管理器中,添加一个对名为 WindowsFormsIntegration.dll 的 Wi

请教WPF中打开浏览器,Post方式传递参数的问题

问题描述 现在在WPF中开发,遇到了一个问题:打算在WPF程序中打开一个网页,并给网页传递参数,在网页中获取参数信息并做处理.由于参数比较长而且含有中文,现在就遇到了这个问题:1.打开网页后,参数值不固定,如果过长,就会被IE截取地址,所以传过去的信息不全,而且会把参数以明文的形式显示出来,不方便.2.参数中有中文,这样导致在打开浏览器中,中文编程了乱码,在网页中获取的内容就不对了我是用Process.Start的方式打开网页的,现在想问问能不能用Post的方式打开,解决传递中参数过长.参数中中

扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注

原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol只能支持文字正向显示.在很多实际项目中,往往需要文字标注有一些角度甚至是沿线标注,下面 我们来看一下原装的TextSymbol和扩展后的TextSymbol的比较和实现思路. 要实现右图的效果只需要从TextSymbol继承一个Symbol并增加Rotation属性,并加载相应的控件模板就行了. 以

WPF中找不到Image或者Image不是Drawing系列

WPF中默认没有引用WinForm里面的一些东西,都是用它自带的那一套,但又不能完全脱离,所以有的时候比较蛋疼  

一起谈.NET技术,WPF 基础到企业应用系列2——WPF前世今生

1.开篇前言      很多时候了解一项新技术的历史和趋势往往比这项技术的本身价值还要重要.WPF作为一项新技术(已经三年多了,或者应该叫老技术了),我们都有必要了解它的来龙去脉,尤其是公司的CTO.技术总监.架构师等决策层,因为他们对技术的选型及应用具有决定权.对于开发者来说,了解自己正在从事的这个技术的前世今生,有助于我们更好的认识技术本身的价值,也可以避免我们少走一些弯路(圣殿骑士 就走过很多弯路,所以对此比较感慨).从IT技术发展的这些年可以看出,技术对于各大公司只是竞争的一种手段,而对

一起谈.NET技术,WPF 基础到企业应用系列3——WPF开发漫谈

1.开篇前言      首先很高兴这个系列能得到大家的关注和支持,基于对大家负责和对自己负责的态度,我会不断努力写好这个系列,分享自己的微薄技术和经验,希望在帮助别人的同时也不断提升自己.由于这篇文章稍多,所以读者花的时间长了一些,也希望大家能够见谅,这个系列以后会每周发三到四篇左右(主要是写一篇差不多要花几晚上,感觉思维比较发散),除了讲WPF技术本身之外,也会讲一些项目具体开发,所以敬请关注.在前两次的文章中我们对WPF有了一个比较全面的认识,那么在本篇文章当中,除了讲一些理论知识外,我们会