6

注: これはコントロールの組み込み動作に関するものであり、ダブルクリック イベントの作成に関するものではありません。

私のプロジェクトの 1 つで、Windows.Forms.WebBrowser コントロールを HTML のエディターおよびビューアーとして使用しています。何年も問題なく動作していましたが、ダブルクリックすると、クリックされた単語が自動的に選択されることに突然気付きました(これは私のコードではなく、コントロールで発生しただけです)。

突然 (正確な時期は不明)、コントロール内のテキストをダブルクリックしても (編集モードまたは表示モードの両方で) 何も起こりません。私のコードではないため、トラブルシューティングが困難ですが、過去にこの機能に依存していたため、最終製品に影響を与えています。

これに影響を与える (Windows または .Net で) 最近何が変更されたのか (私のアプリの同じバージョンは古い Win7 では正常に動作しますが、最新の Win7 では動作しません)。また、どうすれば以前の機能を取り戻すことができますか? DOM でも自分のダブルクリックを接続してから、テキストの解析を開始して手動で選択する必要がありますか (うーん!)?

私はこの質問に対する答えを探しましたが、ほとんどの場合、DOM イベントに接続する方法を確認するだけで、上記の問題を引き起こす最近の変更については何もわかりません)。どんな助けでも大歓迎です。

問題が発生したときにVS 2010、VB、Win7 x64、IE 10.0.6、.Net 3.5(最新のものに関係なく)を使用しています(コンパイルされているので、VSまたはVBであるとは思えません)。

まったく同じコード (コンパイル済み) を Win7 x86 で IE 8 (Win7 Pro プレーン、アップデートなしでインストール) で実行すると、問題なく動作します。

さらにテストした後、IE 10をインストールするとすぐに、Win7 x86の新規インストール(すべてが正常だった)で問題が発生し始めます。したがって、問題はIE 10にあると確信しています。

再現する手順:

  1. VS 2010 で新しい VB.Net プロジェクトを作成し、.Net 3.5 をターゲットにします。
  2. ユーザーコントロールを作成する <--- このステップが重要です
  3. ユーザーコントロールに Web ブラウザーを追加する
  4. このコードをユーザーコントロールに追加します

    Public Sub LoadHTML(html As String)
        WebBrowser1.DocumentText = html
    
        Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
            Application.DoEvents()
        Loop
    
        WebBrowser1.Document.Body.SetAttribute("contentEditable", "false")
    End Sub
    
  5. そのコントロールをフォームに追加する

  6. 次のボタンでフォームにボタンを追加します。クリック イベント:

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        UserControl1.LoadHTML("<html><body>This is a test interesting is it not?</body></html>")
    End Sub
    
  7. プロジェクトを実行し、ボタンをクリックします

  8. 次に、「interesting」という単語をダブルクリックしてみてください。選択されていないことに注意してください。

フォーム上に直接 webbrowser コントロールをスローすると、正常に動作します。問題はユーザーコントロールにあります(IE10にアップデートした後だけの問題です)。

.Net 3.5および4.0を使用してVS 2010を使用して問題を再現できます。.Net 4.5を使用してVS 2012を使用して問題を再現できます。

4

8 に答える 8

3

これは IE10 の既知の問題として報告されていますが (私が見たバグを報告しているリンクはどれもまだ機能していません)、最近のバージョンでは修正されていません (したがって、最終的に移行するときに問題に遭遇しています)。 WinXP/IE8 から Win10/IE11 へ)。

興味深いことに、私が見つけた最良の回避策は、@John が中国のDataZXフォーラムに同じ問題を投稿したことです。

基本的に、この問題は、System.Windows.Forms.WebBrowserコントロールの特定のプロパティがデザイナーからUserControl 内でUserControl.Designer.InitializeComponent()設定され、メソッドに組み込まれるときに発生します。これらのプロパティの割り当てを、初期化プロセスの後半で発生するように移動します。たとえば、UserControl.Loadイベント ハンドラーに移動すると、問題が解決し、コントロールのダブル (+ トリプル) クリック動作が復元されます。

この問題の原因となる既知のプロパティには次のものがあります (ただし、他のプロパティもこの問題または同様の問題を引き起こす可能性があります)。

  • ScriptErrorsSuppressed
  • AllowWebBrowserDrop

したがって、これらのプロパティのいずれかがデザイナーで設定されている場合は、それらを Load イベント ハンドラーに移動すると、ダブルクリックが期待どおりに機能するようになります。

例 (UserControl.designer.vb からの問題コード)

Private Sub InitializeComponent()
    Me.WebBrowser1 = New System.Windows.Forms.WebBrowser()
    Me.SuspendLayout()
    '
    'WebBrowser1
    '
    Me.WebBrowser1.AllowWebBrowserDrop = False 'This line will cause the problem
    Me.WebBrowser1.Location = New System.Drawing.Point(20, 3)
    Me.WebBrowser1.MinimumSize = New System.Drawing.Size(20, 20)
    Me.WebBrowser1.Name = "WebBrowser1"
    Me.WebBrowser1.ScriptErrorsSuppressed = True  'This line will ALSO cause the problem
    Me.WebBrowser1.Size = New System.Drawing.Size(147, 138)
    Me.WebBrowser1.TabIndex = 0
End Sub

問題の原因となっている上記の行をコメントアウトし、UserControl.vb

Private Sub UserControl_Load(sender As Object, e As EventArgs) Handles Me.Load
    'Setting these properties here does not cause any problems
    Me.WebBrowser1.AllowWebBrowserDrop = True 
    Me.WebBrowser1.ScriptErrorsSuppressed = False
    Me.WebBrowser1.DocumentText = "These are test words that you can attempt to double click"
End Sub
于 2015-09-28T01:06:30.823 に答える
3

この問題は、実際には IE 10 のバグです。これは、Microsoft によってここで確認されました。

最も悲しい部分は、影響を受ける人が少なすぎるため (私の会社の何千もの顧客に影響を与えますが)、すぐに修正するつもりはないと彼らが言ったことです。

于 2013-08-03T04:04:35.537 に答える
0

遅れましたが、他の誰かがまだ助けを求めているかもしれません。私はこのHtmlEditorControlを持っていて、DoubleClick が Windows 10 で動作するようにしたかったのです。WebBrowser.DocumentCompleted メソッドに次のコードを追加します。

this.editorWebBrowser.Document.AttachEventHandler("ondblclick", (_object, _event) =>
        {
            //First check if the user has selected something, if not, move the current selection starting from the current location of the text cursor.
            if (string.IsNullOrEmpty(SelectedText.Trim()))
            {
                //All objects bellow are referenced, there is no need to assign them to the HtmlEditorControl again
                // define the selected range object
                mshtml.IHTMLSelectionObject selection;
                mshtml.IHTMLTxtRangerange = null;
                try
                {
                    // calculate the text range based on user selection
                    selection = _mshtmlDocument.selection;

                    if (selection.type.ToLower().Equals("text") || selection.type.ToLower().Equals("none"))
                    {
                        range = (mshtml.IHTMLTxtRange)selection.createRange();
                    }
                }
                catch (Exception)
                {
                    // have unknown error so set return to null
                    range = null;
                    return;
                }

                if (range == null)
                {
                    //error!!
                    return;
                }

                //Move the current selection one word back
                range.moveStart("word", -1);
                range.moveEnd("word", 1);
                range.select();
                if (range.text == null)
                {
                    //error!!
                    return;
                }
            }
        });
于 2016-05-18T16:36:57.300 に答える
0

WebBrowser コントロールは、他のコントロールとうまく連携できません。他のフォーム コントロールから分離して、パネルにカプセル化 (内包) する必要があります。

タブ コントロールで WebBrowser コントロールを使用していましたが、同じ問題がありました。タブ内にパネルを追加し、パネル内に WebBrowser を配置すると、問題はなくなりました。

于 2014-07-20T00:54:43.980 に答える