GeckoFX отключает ввод формы, сохраняя полосы прокрутки

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

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

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


person matan justme    schedule 10.09.2018    source источник


Ответы (1)


Я вижу ряд маршрутов: Вместо 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 app Я добавляю оверлей после завершения загрузки страницы в событии 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/");
        }
    }
}
  1. Переопределите событие OnClick в главном окне приложения или Gecko Dom Events и установите для события значение e.Handled = true;.

Наверняка есть и другие варианты.

person wp78de    schedule 11.09.2018
comment
Ни одно из этих предложений не помогло, но я ценю попытку. - person matan justme; 11.09.2018
comment
В Edge мое решение было простым: проверьте размер страницы, измените размер браузера, чтобы он соответствовал странице, отключите браузер, создайте панель желаемого размера и поместите в нее браузер, используйте полосы прокрутки панели. - person matan justme; 11.09.2018
comment
Однако при смене браузера gecko он тормозит, особенно в больших размерах, попробуйте: 2000 x 20000 например, браузер зависнет. Если бы я нашел решение для этого, было бы здорово, или решение, основанное на оконных дескрипторах. @wp78de - person matan justme; 11.09.2018
comment
Также другим способом было бы изменить размер браузера, нарисовать его на изображении, снова изменить его размер и отобразить изображение на панели. проблема в том, что он будет очень медленным, потребует много ресурсов процессора и не будет работать на высоких скоростях. в edge было легко, в gecko fx подходящего решения не нашел. - person matan justme; 11.09.2018
comment
если ширина равна 100%, то он также принимает полосы прокрутки, поэтому он также отключает полосы прокрутки. следовательно, это не полезно. - person matan justme; 11.09.2018
comment
@matanjustme подход с наложением работает, как и ожидалось, в моем примере приложения WPF. Я могу прокручивать, как в обычном браузере, но не могу ничего щелкнуть или ввести. Вы хотите, чтобы я поделился своим образцом? - person wp78de; 12.09.2018
comment
поделитесь пожалуйста тогда. - person matan justme; 12.09.2018
comment
другой способ: textsaver.flap.tv/lists/25ls, такая же проблема - person matan justme; 12.09.2018
comment
я не программирую в wpf, поэтому понятия не имею, как мне поможет xaml. конечно, если я могу использовать его как конечный пользователь, чтобы просто изменить предоставленные URL-адреса на другие и посмотреть, работает ли он там нормально, это было бы хорошо, конечно, программно, а не как исполняемый файл. - person matan justme; 13.09.2018
comment
Давайте продолжим обсуждение в чате. - person wp78de; 13.09.2018