6

イライラする問題があります。これが私がしていることの単純化されたバージョンです:

c#のUserControlには、ツールバーと埋め込みWebBrowserオブジェクトが含まれています。ツールバーには「編集」ボタンがあり、クリックするとWebブラウザコントロールがデザインモードに設定されます。別のボタン「キャンセル」は、デザインモードをオフにします。

擬似コード(非常に単純化):

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
}

問題: 表示されたWebページをクリックしてから、[編集]ボタンをクリックすると、WebBrowserコントロールが編集可能になりません。写真/リンクにカーソルを合わせると、マウスポインターは、編集用のマウスポインターではなく、Webブラウザーナビゲーションのマウスポインターを表示します。テキストをクリックしても、カレットが表示されません。

デバッグすると、この状況ではドキュメントのdesignModeプロパティが実際には「オン」に設定されていることがわかりますが、コントロールは「オフ」に設定されているかのように動作しています。

[編集]ボタンをクリックする前にWebページをクリックしないと、すべてが期待どおりに機能します。

詳細: コントロールがデザインモードのときに[キャンセル]ボタンをクリックすると、ドキュメントがクリックされた場合に対応する(誤った)動作が発生します。

ドキュメントをクリックせずに[編集]、[キャンセル]、[編集]などをクリックするだけで問題なく動作します(マウスオーバーテストでは適切なマウスポインターが表示され、デザインモードに応じてリンクナビゲーションまたは編集が行われます。表示されたドキュメントのリンクをクリックします)。

designModeプロパティを変更する前に、別のコントロールがフォーカスを取得するようにさまざまな手法を試しましたが、違いはありません。私はMSDNと既知のインターネットの半分を検索しましたが、この種の問題についての言及は見つかりませんでした。このようにdesignModeプロパティを反転することは、非常に珍しいようです。

もう1つの情報:ユーザーコントロールによって実装されたシンクを使用してドキュメントにアドバイスすることにより、ドキュメントイベントを設定しています。これが問題に関係しているとは思えませんが、完全を期すためにここに含めました。更新:これを無効にしても、問題に関しては何も変わりません。

誰かがこの問題を認識していますか?

更新: SetDesignMode()でWebブラウザーコントロールを再作成することにより、問題を回避しました。これは醜い解決策ですが、機能し、実際には問題ないように見えます。ただし、この問題に関するフィードバックには非常に興味があります。MSHTMLのバグだと思います。

4

2 に答える 2

9

まったく同じ問題が発生したかどうかはよくわかりませんが、私の解決策はあなたにも役立つはずです.

基本的な問題は、この記事に記載されているように、x64 が designMode 属性をリセットしたことのようです。私の場合はWebブラウザをインスタンス化した後に「On」に設定したのですが、DocumentCompletedイベントではまた「Inherit」になってしまいました。DocumentCompleted で「オン」に戻すと編集可能になりますが、ドキュメントはクリアされます。DocumentText を再度設定すると、運命のループ全体が再開されます。

したがって、私が見つけた解決策の 1 つは、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 に移動している場合には機能しません。ただし、私にとってはより簡単で安全な別の解決策があります。LaughingJohn によるこの回答で見つけました。最初の行はアプリケーションに依存すると思います.webBrowser1.Documentに直接IHTMLDocumentがありました。

doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
if (doc != null && doc.body != null)
    ((HtmlBody)doc.body).contentEditable = "true";
于 2012-10-02T09:05:58.580 に答える
0

WebBrowserクリックすると がフォーカスされ、どういうわけかそれを保持しているように思えます。これを試してみてください: をクリックしWebBrowser、キーボードの Tab キーを押して (フォーカスが から移動するはずWebBrowserです)、ボタンをクリックできるかどうかを確認します。

可能であれば、ハンドラーをButton.MouseEnterイベントにアタッチし((Button)sender).Foucs()、それを呼び出して、プログラムでボタンにフォーカスしてみてください。

于 2011-10-27T23:13:12.100 に答える