Кликабельные ссылки в элементе управления WebBrowser в режиме редактирования - PullRequest
1 голос
/ 11 августа 2009

Я использую элемент управления Windows.Forms WebBrowser в режиме редактирования, чтобы включить редактирование html в нашем приложении (формы Windows .net 3.5 C #). Проблема состоит в том, что в режиме редактирования ссылки в html не активируются (например, при наведении на них курсора мыши не отображается курсор мыши, а при щелчке по ним курсор просто вставляется в это место, а не перемещается по этой ссылке). *

Я понимаю, что это сделано специально, но возможно ли включить режим редактирования при сохранении работоспособности ссылок? Мы хотим, чтобы пользователь мог перемещаться по набору локальных HTML-страниц, в то же время имея возможность редактировать содержимое.

Я устанавливаю режим редактирования следующим образом, если что-то изменится:

webBrowser.Document.ExecCommand("EditMode", false, null);

Ответы [ 2 ]

2 голосов
/ 17 августа 2009

Вот небольшое приложение WinForm, которое, кажется, работает. При настройке режима редактирования он записывает все позиции ссылок всех тегов A, а затем проверяет положение курсора мыши. Я не уверен, что OffsetRectangle дает правильные значения, если есть фреймы или вложенность тегов, но пример HTML в приложении работает.

Его можно изменить, чтобы при необходимости захватывать клики и т. Д. Из других тегов.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private readonly Dictionary<Rectangle, Uri> _links = new Dictionary<Rectangle, Uri>();
        private readonly Regex _reLink = new Regex("href=['\"](?<link>.*?)['\"]");

        private const string _html =
            "<html><body><br><div style='top:20px;left:50px;border:solid 1px red'><a href='http://www.cnn.com'>CNN</a></div><br><font size='14'>xx</font><a href='http://stackoverflow.com'>stackoverflow</a></body></html>";

        private bool _isEditMode;

        public Form1()
        {
            InitializeComponent();
            webBrowser1.DocumentText = _html;
            webBrowser1.Document.Click += Document_Click;
            webBrowser1.Document.MouseMove += Document_MouseMove;
        }

        private void Document_MouseMove(object sender, HtmlElementEventArgs e)
        {
            if (!_isEditMode) return;
            ChangeCursorIfOverLink(e);
        }

        private void ChangeCursorIfOverLink(HtmlElementEventArgs e)
        {
            foreach (KeyValuePair<Rectangle, Uri> link in _links)
            {
                if (CursorWithinControl(e, link.Key))
                {
                    if (Cursor.Current != Cursors.Hand)
                        Cursor.Current = Cursors.Hand;
                    return;
                }
            }
            Cursor.Current = Cursors.Default;
        }

        private void Document_Click(object sender, HtmlElementEventArgs e)
        {
            NavigateLinkInEditMode(e);
        }

        private void NavigateLinkInEditMode(HtmlElementEventArgs e)
        {
            if (_isEditMode)
            {
                foreach (KeyValuePair<Rectangle, Uri> link in _links)
                {
                    if (CursorWithinControl(e, link.Key))
                    {
                        webBrowser1.Navigate(link.Value);
                        return;
                    }
                }
            }
        }

        private bool CursorWithinControl(HtmlElementEventArgs e, Rectangle rectangle)
        {
            return e.MousePosition.X >= rectangle.Left
                   && e.MousePosition.X <= rectangle.Left + rectangle.Width
                   && e.MousePosition.Y >= rectangle.Top
                   && e.MousePosition.Y <= rectangle.Top + rectangle.Height;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            RecordLinkPositions();
            webBrowser1.Document.ExecCommand("EditMode", false, null);
            webBrowser1.DocumentText = _html;
            _isEditMode = true;
        }

        private void RecordLinkPositions()
        {
            foreach (HtmlElement element in webBrowser1.Document.All)
            {
                if (element.TagName == "A")
                {
                    string url = _reLink.Match(element.OuterHtml).Groups["link"].Value;
                    _links.Add(element.OffsetRectangle, new Uri(url));
                }
            }
        }
    }
}
0 голосов
/ 14 августа 2009

Я бы проверил, когда пользователь наводит указатель мыши на ссылку, и при желании что-нибудь отобразил бы в строке состояния. Разрешить пользователю CTRL + щелкнуть ссылку, чтобы открыть ее.

EDIT: Это может пригодиться: http://www.codeproject.com/KB/mobile/browsermouseevents.aspx?msg=2732899

...