GeckoFX отключает ввод формы, сохраняя полосы прокрутки - PullRequest
0 голосов
/ 11 сентября 2018

Свойство Enabled браузера GeckoFX определяет, может ли весь браузер получать входные данные или нет.

Однако, если он размещен как false, то полосы прокрутки не смогут щелкнуть или перетаскиваться вообще.

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

1 Ответ

0 голосов
/ 11 сентября 2018

Я вижу несколько маршрутов: вместо geckowebbrowser.Enabled = false;

  1. отключить все input, select, textarea, buttonи ссылки на DOM, например

    GeckoElementCollection byTag = _browser.Document.GetElementsByTagName("input");
    foreach (var ele in byTag)
    {
        var input = ele as GeckoInputElement;
        input.Disabled = true;
    }
    

    и т. д.

  2. удаляют события указателя из интерактивных элементов, например,

    var byTag = _browser.Document.GetElementsByTagName("a");
    foreach (var ele in byTag)
    {    
         var a = ele as GeckoHtmlElement;
        //a.SetAttribute("disabled", @"true");
        a.SetAttribute("style", "pointer-events: none;cursor: default;");
    }
    
  3. Использовать невидимое наложение блокировщика CSS ( jsfiddle ), например, используя JavaScript

//UI block
window.onload = function() {        
    var blockUI = document.createElement("div");
    blockUI.setAttribute("id", "blocker");
    blockUI.innerHTML = '<div></div>'
    document.body.appendChild(blockUI);
    
    //unblock it
    //var cover = document.getElementById("blocker").style.display = "none";
}
#blocker
{
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0.0;
    background-color: #111;
    z-index: 9000;
    overflow: auto;
}
<button id="bloc">Blocked UI</button>

В коде моего приложения WPF demo я добавляю наложение после завершения загрузки страницы в DocumentCompletedсобытие:

using Gecko;
using Gecko.DOM;
using System.Windows;
using System.Windows.Forms.Integration;
using System.Linq;    
namespace GeckoWpf {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            Gecko.Xpcom.Initialize("Firefox");
        }    
        void browser_DocumentCompleted(object sender, System.EventArgs e) {
             //unsubscribe
            _browser.DocumentCompleted -= browser_DocumentCompleted;

            GeckoElement rt = _browser.Document.CreateElement("div");
            rt.SetAttribute("id", "blocker");
            rt.SetAttribute
            (
            "style",
            "position: fixed;"
            + "top: 0px;"
            + "left: 0px;"
            + "width: 100%;"
            + "height: 100%;"
            + "opacity: 0.0;"
            + "background-color: #111;"
            + "z-index: 9000;"
            + "overflow: auto;"
            );
            _browser.Document.Body.AppendChild(rt);
        }    
        WindowsFormsHost _host = new WindowsFormsHost();
        GeckoWebBrowser _browser = new GeckoWebBrowser();    
        private void Window_Loaded(object sender, RoutedEventArgs e) {
            _browser.DocumentCompleted += browser_DocumentCompleted;
            _host.Child = _browser;
            GridWeb.Children.Add(_host);    
            _browser.Navigate("https://www.google.com/");
        }
    }
}
Переопределите событие OnClick в главном окне приложения или в событиях Gecko Dom и установите для этого события значение e.Handled = true;

Конечно, есть и другие варианты.

...