我正在创建一个epub书籍阅读器。 显示书籍后,我想让用户在书中添加一些注释。
要显示这本书,我正在使用加载本地html文件的wpf webbrowser控件
我想通过创建上下文菜单或显示弹出窗口来操作此控件上的选定文本
我试图改变控件的上下文菜单,但通过搜索我发现这是不可能的
这是我想用选定文字做的一个例子:
IHTMLDocument2 htmlDocument = (IHTMLDocument2)webBrowser1.Document;
IHTMLSelectionObject currentSelection = htmlDocument.selection;
if (currentSelection != null)
{
IHTMLTxtRange range = currentSelection.createRange() as IHTMLTxtRange;
if (range != null)
{
MessageBox.Show(range.text);
}
}
答案 0 :(得分:1)
WPF的原生浏览器控件不允许您设置自定义上下文菜单。
情况变得更糟;当您的鼠标位于浏览器组件上方时,或者如果它具有焦点,它将不会捕获您的输入生成的事件。
解决这个问题的方法是在WindowsFormsHost中使用Windows窗体浏览器控件。
首先,将Windows.Forms
添加到项目参考中。
然后,执行以下操作:
<强> XAML:强>
<Window x:Class="blarb.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<WindowsFormsHost Name="windowsFormsHost" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</Grid>
</Window>
C#代码:
public partial class MainWindow : Window
{
private System.Windows.Forms.WebBrowser Browser;
public MainWindow()
{
InitializeComponent();
//initialise the windows.forms browser component
Browser = new System.Windows.Forms.WebBrowser
{
//disable the default context menu
IsWebBrowserContextMenuEnabled = false
};
//make a custom context menu with items
System.Windows.Forms.ContextMenu BrowserContextMenu = new System.Windows.Forms.ContextMenu();
System.Windows.Forms.MenuItem MenuItem = new System.Windows.Forms.MenuItem {Text = "Take Action"};
MenuItem.Click += MenuItemOnClick;
BrowserContextMenu.MenuItems.Add(MenuItem);
Browser.ContextMenu = BrowserContextMenu;
//put the browser control in the windows forms host
windowsFormsHost.Child = Browser;
//navigate the browser like this:
Browser.Navigate("http://www.google.com");
}
private void MenuItemOnClick(object sender, EventArgs eventArgs)
{
//will be called when you click the context menu item
}
}
这还没有解释如何进行突出显示。
您可以在加载完成后侦听浏览器组件触发的事件,然后替换它加载的文档部分,注入html代码进行突出显示。
请注意,在某些情况下(例如,在divs
,spans
或paragraphs
选择文字时)可能会非常棘手。
答案 1 :(得分:0)
using mshtml;
private mshtml.HTMLDocumentEvents2_Event documentEvents;
在构造函数或xaml中设置LoadComplete事件:
webBrowser.LoadCompleted += webBrowser_LoadCompleted;
然后在该方法中创建新的webbrowser文档对象并查看可用属性并创建新事件,如下所示:
private void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
documentEvents = (HTMLDocumentEvents2_Event)webBrowserChat.Document; // this will access the events properties as needed
documentEvents.oncontextmenu += webBrowserChat_ContextMenuOpening;
}
private bool webBrowserChat_ContextMenuOpening(IHTMLEventObj pEvtObj)
{
return false; // ContextMenu wont open
// return true; ContextMenu will open
// Here you can create your custom contextmenu or whatever you want
}