在WPF中定製WebBrowser快捷選單
本文主要講述如何在這篇文章中的ShowContextMenu方法中彈出自己的ContextMenu。
先來看看在WinForm中是如何實現的:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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 highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在WPF中嵌入WebBrowser視覺化頁面Web視覺化
- UITextView定製彈出選單UITextView
- 在Excel中製作下拉選單的3種方法Excel
- 定製多系統啟動選單
- WPF/C#:讓繪製的圖形可以被選中並將資訊顯示在ListBox中C#
- WPF和js互動 WebBrowser資料互動JSWeb
- WPF/C#:在DataGrid中顯示選擇框C#
- 右鍵選單中的文字文件新增快捷鍵
- C# WebBrowser設定代理C#Web
- 利用純 CSS3 定製單選/多選框樣式CSSS3
- webbrowser在html中寫入內容並新增jsWebHTMLJS
- 用C++ Builder來定製系統選單(轉)C++UI
- 選單欄快捷命令:QuickLinks for MacUIMac
- QuickLinks for Mac(選單欄快捷命令)UIMac
- WPF基礎:在Canvas上繪製圖形Canvas
- 在 Hyperf 框架中,如何定製 gen:model 命令框架
- WPF/C#:在WPF中如何實現依賴注入C#依賴注入
- 在WPF設計工具Blend2中製作立方體圖片效果
- 在PyQt中構建 Python 選單欄、選單和工具欄QTPython
- WPF實現Win10漢堡選單Win10
- 設定radio單選按鈕預設選中
- 設定select下拉選單的預設選中項
- C#中WebBrowser的使用C#Web
- c# winform之contextmenu快捷選單C#ORMContext
- 在jsavaScript中設定select的某個選項被選中JS
- 怎麼清除win10系統右鍵選單中的“快捷操作組”選項Win10
- 在.bashrc 裡用 alias 設定快捷命令
- WPF 使用快捷鍵方式製作簡易的 Word 上的 Latex 輸入法
- 如何快速在odoo中建立自己的選單Odoo
- 使用 Java 在Excel中建立下拉選單JavaExcel
- WebBrowser 控制元件設計模式設定Web控制元件設計模式
- 怎樣給App選單命令新增快捷鍵APP
- 定製gridview使其在listview中當作item使用View
- 3dmax複製快捷鍵命令 3d中的複製快捷鍵是什麼3D
- C#防止WebBrowser在新視窗中開啟連結頁面C#Web
- WPF實現樹形下拉選單框(TreeComboBox)
- AngualrJS中製作一個有關選單的DirectiveJS
- Android:在eclipse中快捷鍵AndroidEclipse