イライラする問題があります。これが私がしていることの単純化されたバージョンです:
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のバグだと思います。