【问题标题】:GeckoFX disable form input while keeping scrollbarsGeckoFX 在保持滚动条的同时禁用表单输入
【发布时间】:2018-09-10 22:31:25
【问题描述】:

GeckoFX 浏览器的Enabled 属性决定了整个浏览器是否可以获取输入。

但是,如果将其设置为false,则滚动条根本无法点击或拖动。

我正在寻找一种在不禁用滚动条的情况下禁用整个浏览器的方法,简单来说,就是禁用所有内容,阻止它们从表单获取输入。

【问题讨论】:

    标签: c# geckofx window-handles


    【解决方案1】:

    我看到了许多路线:而不是geckowebbrowser.Enabled = false;

    1. disable all inputselecttextareabutton,以及 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;
    }
    &lt;button id="bloc"&gt;Blocked UI&lt;/button&gt;

    在我的 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/");
            }
        }
    }
    
    1. 覆盖主应用程序窗口或 Gecko Dom 事件中的 OnClick 事件并将事件设置为 e.Handled = true;

    当然还有其他选择。

    【讨论】:

    • 这些建议都没有帮助,但我很感激这次尝试。
    • 在 Edge 中我的解决方案很简单,检查页面大小,更改浏览器大小以适应页面,禁用浏览器,创建所需大小的面板并将浏览器放入其中,使用面板滚动条。
    • 但是,当更换 gecko 浏览器时,它会减慢速度,尤其是在大尺寸时,尝试:例如 2000 x 20000,浏览器将冻结。如果我能找到解决方案,那就太好了,或者基于窗口句柄的解决方案。 @wp78de
    • 另一种方法是调整浏览器大小,将其绘制为图像,再次调整大小并在面板中显示图像。问题是它会很慢,占用大量cpu,而且不能活到高端。在边缘很容易,在壁虎 fx 中我找不到合适的解决方案。
    • 如果宽度为 100%,那么它也包含滚动条,所以它也会禁用滚动条。因此,它没有用。
    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多