まずこの使用法はサポート外のようです。
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プロパティにバインディング(遅い遅いと言われているよう)
とかでしょうか。
(なぜバインディングしているか等)もう少し詳しい使用法がわかると、ほかの解決策もあるかもしれません。
追記
AvalonEdit
のSyntaxHighlighting
をテストしました。
専用エディタとしてどんなフォーマットがいいか悩んだのですが、安直に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のネストの例があまり見つからず大変でした^^;
ついでにFolding
・Code Completion
も使ってみました。
雑とはいえかなりのコード量になったため、GitHubにあげました。
TN8001/IniEditor: AvalonEdit Syntax Highlighting, Folding and Code Completion example.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/18 23:51
2020/04/19 00:27
2020/04/19 03:09
2020/04/23 09:29
2020/04/24 12:07