代码之家  ›  专栏  ›  技术社区  ›  Ludvig A. Norin

文档属性更改时,WPF WebBrowser控件不会进入设计模式

  •  5
  • Ludvig A. Norin  · 技术社区  · 16 年前

    c#中的UserControl包含工具栏和嵌入式WebBrowser对象。工具栏包含一个“编辑”按钮,单击该按钮可将webbrowser控件设置为设计模式。另一个按钮“取消”关闭设计模式。

    伪代码(非常简化):

    public void SetDesignMode(bool dm) {
      IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
      if (dm) doc.designMode = "On";
      else doc.designMode = "Off";
      _designMode = dm;
      ReloadDocument(); // setting designmode clears the document element, so it must be reloaded
    }
    
    public void OnLoadCompleted() {
      IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
      if (!_documentLoaded) {
        if (_designMode) doc.designMode = "On";
        else doc.designMode = "Off";
        ReloadDocument();
        _documentLoaded = true;
      }
    }
    
    public void ReloadDocument() {
      _documentLoaded = false;
      // code that navigates to the document
    }
    

    问题是: 如果单击显示的网页,然后单击“编辑”按钮,WebBrowser控件将不可编辑。浏览图片/链接时,鼠标指针将显示web浏览器导航鼠标指针,而不是编辑鼠标指针。如果我在文本中单击,插入符号将不会显示。

    调试显示,在这种情况下,文档上的designMode属性实际上设置为“开”,但控件的行为就像设置为“关”。

    如果我 不要 单击网页,然后单击“编辑”按钮,

    阐述:

    在我更改designMode属性之前,我尝试了各种技术来确保另一个控件获得焦点,但这没有任何区别。我搜索了MSDN和一半已知的互联网,没有发现任何关于此类问题的提及。像这样翻转designMode属性似乎很不寻常。

    还有一个小贴士:我通过使用usercontrol实现的接收器通知文档来设置文档事件。我怀疑这与这个问题有什么关系,但为了完整起见,我把它包括在这里。 更新: 禁用此选项不会改变有关问题的任何内容。

    有人认识到这个问题吗?

    更新: 我通过在SetDesignMode()中重新创建web浏览器控件解决了这个问题。这是一个丑陋的解决方案,但它有效,而且看起来确实不错。不过,我对这个问题的任何反馈都很感兴趣。我相信这是MSHTML中的一个bug。

    2 回复  |  直到 11 年前
        1
  •  9
  •   Community Mohan Dere    9 年前

    我不太确定我们是否遇到了完全相同的问题,但我想我的解决方案也应该适用于您。

    基本问题似乎是x64重置了designMode属性,如中所述 this article

    因此,我找到的一个解决方案是避免设置DocumentText,而是创建了一个空文档,然后设置正文(此时不再为null)的InnerHtml属性:

    doc.designMode = "On"; // enable editing
    
    // designMode change resets the document, create it anew
    webBrowser1.Document.Write("<html><body></body></html>")
    webBrowser1.Document.Body.InnerHtml = "myDocumentText"
    

    显然,这只在文本准备就绪时有效,而在导航到URL时无效。然而,还有另一种解决方案对我有效,它似乎更容易、更安全。我在一个房间里找到的 this answer 约翰笑着说。我想第一行取决于您的应用程序,您的IHTMLDocument直接位于webBrowser1.Document中。

    doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
    if (doc != null && doc.body != null)
        ((HtmlBody)doc.body).contentEditable = "true";
    
        2
  •  0
  •   Sheridan    14 年前

    WebBrowser 当你点击它并以某种方式抓住它时,它会获得焦点。试试这个:点击 控件 ,然后按键盘上的Tab键(该键 将焦点从屏幕上移开 控件

    如果可以,请尝试将处理程序附加到 Button.MouseEnter ((Button)sender).Foucs() 在它中,以编程方式聚焦按钮。