質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1274閲覧

WPF RichTextBox キー編集がうまくいかない

mnhktm

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2020/04/18 13:50

いつもお世話になっています。
WPF デスクトップでプログラムしています。
richTextBox にテキストファイルを読み込んでキー入力で編集できるように
しようとしています。何とか編集出来掛ったとき、エンターキーを押すとその位置以前
までのテキストが消えてしまいます。そのまま編集を続けるとそれ以降正常です。
最初のキー入力のみおかしい動作のようです何が間違て何が不足なのかわかりません。
因みにマウス選択は正常です。

XAML は以下の通りです。

<Grid> <RichTextBox Margin="4,57,1,1" Background="#FFD3DE66"       VerticalScrollBarVisibility="Auto" AcceptsReturn="True" Block.LineHeight="1" IsReadOnly="False" IsEnabled="True" > <FlowDocument> <Paragraph> <Run Text="{Binding TEXTCTL}" FontFamily="Meiryo FontSize="14"/> </Paragraph> </FlowDocument> </RichTextBox> </Grid>

TEXTCTL = string です。読み込みと表示までは正常です。
Microsoft Visual Studio Community 2019を使用しています。
宜しくお願います。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずこの使用法はサポート外のようです。
Run.Text プロパティ (System.Windows.Documents) | Microsoft Docs

注意

Run 内RichTextBoxに含まれるオブジェクトへのテキストのバインドはサポートされていません。 内でRichTextBox操作を編集すると、バインドがクリアされる可能性があります。

いろいろ実験していたら、コードビハインドでSourceを明示して追加した場合消えなくなりました。??

cs

1var run = new Run { FontFamily = new FontFamily("Meiryo"), FontSize = 14, }; 2var binding = new Binding("TEXTCTL") { Source = DataContext, }; 3run.SetBinding(Run.TextProperty, binding); 4richTextBox.Document.Blocks.Add(new Paragraph(run));

しかし先頭に文字追加・途中で改行・行の削除等々、期待する動作と違わないですか?

じゃあどうするかですが、

WPFのRichTextBoxにBindingする - Qiita
の方法2や方法3(プロパティ単体ではViewでの変更を検知できない)

RichTextBox・xceedsoftware / wpftoolkit Wiki
のTextプロパティにバインディング(遅い遅いと言われているよう)

とかでしょうか。

(なぜバインディングしているか等)もう少し詳しい使用法がわかると、ほかの解決策もあるかもしれません。


追記
AvalonEditSyntaxHighlightingをテストしました。

専用エディタとしてどんなフォーマットがいいか悩んだのですが、安直にINIファイルにしました^^;

強調する構文
  • コメント(Green)
  • セクション名(Bold Blue)
  • キー名(Firebrick)
  • 最初のイコール(SteelBlue)
  • 数値(DarkBlue)
  • bool(DarkCyan)
  • エラー(Red)
    • セクション前後の文字
    • キーなし
    • イコールなし

アプリ画像

xml

1<?xml version="1.0"?> 2<SyntaxDefinition name="INI" extensions=".ini" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008"> 3 <Color name="Comment" foreground="Green" /> 4 <Color name="Bracket" foreground="Black" /> 5 <Color name="Section" foreground="Blue" fontWeight="bold" /> 6 <Color name="Key" foreground="Firebrick" /> 7 <Color name="Equal" foreground="SteelBlue" /> 8 <Color name="TrueFalse" foreground="DarkCyan" /> 9 <Color name="NumberLiteral" foreground="DarkBlue" /> 10 <Color name="Error" foreground="Red" /> 11 12 <RuleSet> 13 <!-- コメント行 --> 14 <Span begin="^;" color="Comment" /> 15 16 17 <!-- セクション行 --> 18 <!-- ベースをエラーにして正しい部分だけ色を付ける 19 '='が含まれていなく(パラメータ行ではない)後ろに'['がある行全体 20 "^[^=]*?[" だと'['がErrorに食われてしまうので肯定先読み 21 ".+?(?=])" も同様 ']'をSectionに含めない --> 22 <Span begin="^[^=]*?(?=[)" color="Error" > 23 <RuleSet> 24 <Span begin="[" end="" color="Bracket" /> 25 <Span begin="]" end="" color="Bracket" /> 26 <Span begin=".+?(?=])" end="" color="Section" /> 27 </RuleSet> 28 </Span> 29 30 31 <!-- パラメータ行 --> 32 <!-- キーなし(イコール始まり)はエラー --> 33 <Span begin="^\s*=" color="Error" /> 34 <!-- イコールなしはエラー --> 35 <Span begin="^(?!.*=).+$" color="Error" /> 36 37 <!-- キー名&初めのイコール --> 38 <!-- まず肯定先読みでイコールの前まで取り色付け 39 以降をネストのSpanで処理する--> 40 <Span begin="^[^[]*?(?==)" color="Key"> 41 <RuleSet> 42 <!-- イコールが先頭で来るのは確定なのでイコール1文字だけ取り色付け 43 以降をネストのSpanで処理する--> 44 <Span begin="=" color="Equal"> 45 <RuleSet> 46 <Import ruleSet="TrueFalse" /> 47 <Import ruleSet="NumberLiteral" /> 48 <!-- boolでもnumberでもなければ黒に上書き --> 49 <Rule foreground="Black">.</Rule> 50 </RuleSet> 51 </Span> 52 </RuleSet> 53 </Span> 54 55 </RuleSet> 56 57 58 <RuleSet name="TrueFalse" ignoreCase="true"> 59 <Keywords color="TrueFalse"> 60 <Word>true</Word> 61 <Word>false</Word> 62 </Keywords> 63 </RuleSet> 64 65 <RuleSet name="NumberLiteral"> 66 <Keywords color="NumberLiteral"> 67 <Word>NaN</Word> 68 </Keywords> 69 <Rule color="NumberLiteral"> 70 \b0[xX][0-9a-fA-F]+ # hex number 71 | \b 72 ( \d+(.[0-9]+)? #number with optional floating point 73 | .[0-9]+ #or just starting with floating point 74 ) 75 ([eE][+-]?[0-9]+)? # optional exponent 76 </Rule> 77 </RuleSet> 78</SyntaxDefinition>

各言語用のxshdはたくさんあるのですが、キーワード主体で先読み後読みやSpanのネストの例があまり見つからず大変でした^^;

ついでにFoldingCode Completionも使ってみました。
雑とはいえかなりのコード量になったため、GitHubにあげました。
TN8001/IniEditor: AvalonEdit Syntax Highlighting, Folding and Code Completion example.

投稿2020/04/18 22:23

編集2023/07/21 10:18
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mnhktm

2020/04/18 23:51

TN8001さん ご回答いただきありがとうございます。  VisualStudioのデザイナーでrichTextBoxを貼り付けるとRun.Textが自動 でxaml に記述されており、何の疑いもなく、Bind していました。Textは あくまでTextでBindはサポート外なのですね。  バインディングの必要性ですが、プログラムの中で使用するテキストを 編集する専用のメモ帳を作ろうとしていました。当初はTextBoxを使用 しておりBindingもうまくいっているのですが、欲が出てrichTextBoxに 切り替えて試していたところです。  私にはもう少し勉強が必要ですが、ご紹介いただいた -Qiita の方法3 が有効かもしれません。
TN8001

2020/04/19 00:27

書式をつけるとなるとRTFなりXAMLなりで保存するより仕方がないですが > プログラムの中で使用するテキスト はプレーンじゃないと扱いにくいような。。 ルールがはっきりしている強調表示なら、AvalonEditのSyntaxHighlightingを使うという手はどうでしょう。https://vdlz.xyz/Csharp/Porpose/Editor/AvalonEdit/Doc/UsingAvalonEdit.html
mnhktm

2020/04/19 03:09

ありがとうございます。ご察しの通りです。AvalonEdit 興味があります。 私の無知ながら想像すると、基本クラスへだいぶ遡ったところから工夫して 作られたものなんでしょうね、と想像してしまいます。 他の方もいろいろチャレンジしているようですね。仰る通り「プレーン」 であることが本質かもしれません。考え方が整理でて、何か楽しく なりました。ありがとうございます。
TN8001

2020/04/23 09:29

AvalonEditを提案だけではなんなので、この数日どの程度までできそうか確認していたのですが、正規表現は苦手なので超難航していました^^; 結論を申しますと、エディタレベルに求められる強調表示なら十分表現可能だと思います。 Visual Studioのようなコード解析には及びようもないですが、正規表現を駆使すればある程度の文脈を読んだ強調表示ができました。
mnhktm

2020/04/24 12:07

TN8001さん貴重な時間をさいて下さったのですね。ありがとうございます。 私のレベルはまだまだですが、ご提示頂いた内容高度なので勉強させていただきます。 IniEditor、できるようになればわくわくします。 ちょっと的外れかもしれませんが、その昔Turbo C の カラーカスタマイズを思い出しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問