none
WPFのRichTextBoxについて RRS feed

  • 質問

  • 初めて投稿させていただきます。

    現在、WPF アプリケーション(.NetFrameWork3.5を使用)を開発しているのですが、RichTextBoxである操作をすると必ずエラーが起きる現象が発生しており、原因をつかめずにいます。

    エラーの起こる操作は、以下になります。

    1. RichTextBoxで複数行(3行程度)のデータを作成し、一度保存。
    2. 再度その保存したデータを読み込み、テキストの一番最下(一番最後の文字を含む)とそれ以外の行の文字を選択して、選択した文字列を別の文字に置き換える。

    あいうえお

    かきくけこ  ←この行の「こ」から「そ」までを選択して別の文字列に置き換えようとします。

    さしすせそ

    すると、エラー「種類 'System.ExecutionEngineException' の例外がスローされました。」が発生。

    IMEがONの場合のみ発生するようです。IMEはMicrsoftIME2010を使用していますが、GoogleIMEだと同じ操作をしてもエラーは起こりません。


    保存時に使用しているコードは以下です。

        'ファイルの保存
        Private Sub SaveFile(ByVal strPath As String)
            Dim TxtRange As TextRange
            Dim FStream As System.IO.FileStream

            TxtRange = New TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)
            FStream = New System.IO.FileStream(strPath, IO.FileMode.Create)
            TxtRange.Save(FStream, DataFormats.Rtf)
            FStream.Close()
        End Sub

        'ファイルのロード
        Private Sub LoadFile(ByVal strPath As String)
            Dim txtRange As TextRange
            Dim FStream As System.IO.FileStream

            If System.IO.File.Exists(strPath) Then
                txtRange = New TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)
                FStream = New System.IO.FileStream(strPath, System.IO.FileMode.OpenOrCreate)
                txtRange.Load(FStream, DataFormats.Rtf)
                FStream.Close()
            End If
        End Sub

    現状、IMEを変更することができませんので、PreviewKeyDown時に選択されている文字列を先に消すことで対処していますが、対処療法としての処理になりますので、RichTextBoxにもともと潜んでいるエラーなのか、なにか処理が足りないのかを知りたいと思い質問させていただきました。

    もし何か分かるようでしたら、ご教授のほどよろしくお願い致します。


    2015年6月5日 2:19

すべての返信

  • こんにちは。

    取り急ぎ、再現しますね。

    1. ファイルのLoad後でなければ発生しない。
    2. 文中では発生しない。(文末まで選択する必要がある)
    3. .NET4.0以降では発生しない。
    4. DataFormats.Rtf以外では発生しない。


    なんだかバグっぽい予想はしてますが、Connectなどには見当たりませんでした。
    もう少し調べてみます。

    尚、私の環境で発生したのは「ArgumentException:要求された距離は、関連するドキュメントのコンテンツ外です。」でした。

    (追記)一応スタックトレースも載せておきます。
       場所 System.Windows.Documents.TextPointer..ctor(TextContainer textContainer, Int32 offset, LogicalDirection direction)
       場所 System.Windows.Documents.TextContainer.System.Windows.Documents.ITextContainer.CreatePointerAtOffset(Int32 offset, LogicalDirection direction)
       場所 System.Windows.Documents.TextStore.RaiseCompositionEvents(Int32& appSelectionAnchorOffset, Int32& appSelectionMovingOffset)
       場所 System.Windows.Documents.TextStore.HandleCompositionEvents(Int32 previousUndoCount)
       場所 System.Windows.Documents.TextStore.GrantLockWorker(LockFlags flags)
       場所 System.Windows.Documents.TextStore.RequestLock(LockFlags flags, Int32& hrSession)


    2015年6月5日 3:00
    モデレータ
  • Tak1wa様、ご返信ありがとうございます。

    1. ファイルのLoad後でなければ発生しない。

    についてですが、ファイルをロードしなくても同じような現象が発生することを確認しました。

    RichTextBoxに文字を3行ほど文字を入力後、装飾(文字色、太字、下線など)を行い、全選択した後その選択した文字列を別の文字に置き換えようとすると発生します。

    エラー自体は同じですが、この場合は文字装飾をすれば必ず起こるというわけではないので別ものなのかもしれませんが・・・。

    もう少し調査してみます。

    お手数をおかけして申し訳ありませんが、もし何かわかりましたらよろしくお願い致します。

    2015年6月5日 4:50