0

我正在创建一个 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);
                }
            }
4

2 回答 2

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时)spansparagraphs

于 2013-04-04T11:38:05.610 回答
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
}
于 2016-03-28T18:31:38.963 回答