在WPF中定製WebBrowser快捷選單

iDotNetSpace發表於2009-02-23

本文主要講述如何在這篇文章中的ShowContextMenu方法中彈出自己的ContextMenu。

先來看看在WinForm中是如何實現的:

在WPF中定製WebBrowser快捷選單
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpublic 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物件進行了封裝,使其處理所有的事件,所以介於WinFormWPFContextMenu物件實現的不同,比如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中彈出WPFContextMenu時,第一次可以彈出正確的選單,但第二次在WebBrowser中右擊時選單會消失,但ShowContextMenu將不會被觸發。而在第三次右擊時選單才會彈出。

那我想到的就是將WinForm中的ContextMenu嵌入到WPF中使用,這是隻要解決一個問題即可,就是在Show是傳入一個Control物件即可,

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

在WPF中定製WebBrowser快捷選單
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-557462/,如需轉載,請註明出處,否則將追究法律責任。

相關文章