2013-04-04 3 views
0

Я создаю книгу для чтения электронных книг. После отображения книги я хочу, чтобы пользователи могли добавить в книгу некоторые аннотации.манипулировать выбранным текстом на wpf webbrowser

Чтобы отобразить книгу, я с помощью элемента управления WebBrowser WPF, который загружает локальный HTML файлы

Я хочу, чтобы манипулировать выделенный текст этого элемента управления путем создания контекстного меню или показывать всплывающее окно

I» ве пытались изменить ContextMenu элемента управления, но при поиске я обнаружил, что не представляется возможным

это пример того, что я хочу сделать с выбранным текстом:

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

Это вопрос? чего именно вы хотите достичь? что вы пробовали? мы можем увидеть какой-то код? –

+0

Я отредактировал вопрос – sansa

+0

для тех, кто проголосовал, не могли бы вы объяснить почему? !! или указание, если это дублирование – sansa

ответ

1

Встроенный элемент управления браузера WPF не позволит вам настраивать настраиваемое контекстное меню.

Это становится еще хуже; в то время как ваша мышь находится над компонентом браузера, или если она имеет фокус, она не будет захватывать события, созданные вашим входом.

Способом этого является использование браузера браузера окон в WindowsFormsHost.

Чтобы начать, добавьте 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, например)

+0

@Timthy thanks;) – sansa

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 
} 
Смежные вопросы