原文:浏览器扩展系列————在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 = ;   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。

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

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

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  2. 浏览器扩展系列————异步可插入协议(pluggable protocol)的实现

    原文:浏览器扩展系列----异步可插入协议(pluggable protocol)的实现 IE中有很多我们比较熟悉的协议,如http,https,mailto,ftp等.当然你也可以实现自己定义的协议 ...

  3. 在WPF中嵌入WebBrowser可视化页面

    无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrow ...

  4. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中部件的快捷菜单策略(contextMenuPolicy)取值及含义

    在Qt Designer中可以设置部件的快捷菜单策略,快捷菜单通过在部件上点击鼠标右键触发. 快捷菜单策略通过枚举类型Qt.ContextMenuPolicy来定义,对应枚举类型取值及含义如下: 通过 ...

  6. WPF中使用WebBrowser

    最近在做北京现代项目的时候,遇到一个需求将韩国那边写好的网页嵌套到WPF程序中显示. 开始的时候使用的是第三方的浏览器控件:awesomium,在本地测试,显示没有问题.但是拿到客户现场,只显示半屏. ...

  7. WPF入门教程系列十七——WPF中的数据绑定(三)

    四. XML数据绑定 这次我们来学习新的绑定知识,XML数据绑定.XmlDataProvider 用来绑定 XML 数据,该XML数据可以是嵌入.Xmal文件的 XmlDataProvider 标记中 ...

  8. WPF中的WebBrowser

    MainWindow.xaml.cs //新窗口事件 { Uri uri = new Uri(textBox_uri.Text); System.Windows.Forms.Integration.W ...

  9. C# WPF 中WebBrowser拖动来移动窗口,改变窗口位置

    前言 wpf中的WebBrowser相比之前的winform阉割了不少东西,也增加了不少东西,但是msdn对wpf也没有较好的文档 WebBrowser可以说是一个.NET控件,相对于WPF中的控件, ...

随机推荐

  1. Bulk Insert具体订单

    Bulk Insert具体订单 BULK INSERT与用户指定的格式的数据文件复制到数据库表或视图. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ] ...

  2. URAL - 1966 - Cycling Roads(并检查集合 + 判刑线相交)

    意甲冠军:n 积分,m 边缘(1 ≤ m < n ≤ 200),问:是否所有的点连接(两个边相交.该 4 点连接). 主题链接:http://acm.timus.ru/problem.aspx? ...

  3. IIS安装asp组件:JMail 邮件收发组件

    JMail简介 jmail是一种服务器端的邮件发送组件,和个人用的客户端邮件软件不一样的.jmail是在服务器上给程序用来发邮件用的,除了软件编程人员,其他人一般平常用不上. jmail是一个第三方邮 ...

  4. Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐户管理权限

    原版的:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题文件夹:http://blog.csdn.net/dba_huangzj ...

  5. 第四-generation音频:互联网智能声音会火

    我把声音分成四个年龄:传统的立体声插头线-蓝牙音响-wifi发出声音-智能声音. 传统的立体声插头线:传统的声音,您必须使用电缆和其他输入源.这样的声音是现在市场上最流行的音频上. 蓝牙音响:蓝牙无线 ...

  6. bnu 34982 Beautiful Garden(暴力)

    题目链接:bnu 34982 Beautiful Garden 题目大意:给定一个长度为n的序列,问说最少移动多少点,使得序列成等差序列,点的位置能够为小数. 解题思路:算是纯暴力吧.枚举等差的起始和 ...

  7. BZOJ 1096 ZJOI2007 仓库建设 边坡优化

    标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...

  8. Servlet上传文件

    Servlet上传文件 1.准备工作 (1)利用FileUpload组件上传文件,须要到apache上下载commons-fileupload-1.3.1.jar 下载地址:http://common ...

  9. Andrid 多线程下载

    本文转自:http://www.2cto.com/kf/201205/130969.html 本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言 ...

  10. 如何对 GIT 分支进行规划? (转)

    项目背景: 该项目是在2011年11月份使用Asp.net三层帮荷兰某个客户开发的机票预定系统 该客户主要是做中国与欧洲的旅行社业务,特别是最近两年由于中国的发展因此客户也越来越重视机票业务 于是他们 ...