##前提
環境:VS2019 .NET Framework 4.5.1
言語:C# WPF
フレームワーク:MVVM
##悩んでいる事
リッチテキストボックスにおいて、以下の点が分からず悩んでおります。
3. 中身を拡大させるには
0. 文字列を折り返さないようにするには
2. 横スクロールバーを表示するには
1.中身を拡大させるには
リッチテキストボックス上で[Ctrl + マウスホイール]で拡大・縮小するように実装しています。
現状ですと、リッチテキストボックスコントロール自体を拡大してしまっている状態です。
これを、リッチテキストボックスのDocumentプロパティに対して、拡大・縮小を行う事は可能でしょうか。
WinFormだと、ZoomFactorプロパティがありコントロールの内容をズームすることができたのですがWPFではなくなってしまっているようです。
2.文字列を折り返さないようにするには
文字を拡大した際に、リッチテキストボックスの幅を超える場合は自動的に折り返されてしまいます。
文字が大量にある場合に折り返すと著しくレンダリングのパフォーマンスが落ちるため、折り返しをしないようにしたいのですが、リッチテキストボックスに用意されていないようです。
イメージ的には、TextWrapping="NoWrap" のようなプロパティを付けたいのですが、可能でしょうか。
試してみた事としては、MinWidth や Widthプロパティに大きな値をセットする事で折り返さないようにはできたのですが、横スクロールバーが表示されず、文字数の多い行は画面に見えている範囲でしか見えなくなってしまいました。
###3.横スクロールバーを表示するには
「文字列を折り返さないようにするには」でラッピングによる解決できればこちらも芋づる式に解決できそうな気はします。
##コード
BindableRichTextBox はリッチテキストボックスのDocumentプロパティをバインド可能にしたコントロールです。なのでリッチテキストボックスと思って差し支えありません。
Xaml
1<ScrollViewer 2 Grid.Column="2" Grid.Row="1" 3 Grid.ColumnSpan="2" 4 > 5 <b:BindableRichTextBox 6 PreviewMouseWheel="BindableRichTextBox_OnPreviewMouseWheel" 7 Document="{Binding SelectedFlowDocument}" 8 9 BorderThickness="1" 10 IsReadOnly="True" 11 > 12 <b:BindableRichTextBox.LayoutTransform> 13 <ScaleTransform 14 ScaleX="{Binding ElementName=Scale, Path=Value}" 15 ScaleY="{Binding ElementName=Scale, Path=Value}"/> 16 </b:BindableRichTextBox.LayoutTransform> 17 </b:BindableRichTextBox> 18</ScrollViewer> 19<!--隠し項目--> 20<Slider x:Name="Scale" 21 Grid.Row="0" Grid.Column="0" 22 Minimum="1" Maximum="100" Visibility="Collapsed"/>
コードビハインドです。
[Ctrl]を押下している場合にのみ、拡大率を制御するようにしています。
C#
1/// <summary> 2/// リッチテキストボックス上でマウスホイールが変化した時に発火 3/// </summary> 4/// <param name="sender"></param> 5/// <param name="e"></param> 6private void BindableRichTextBox_OnPreviewMouseWheel(object sender,MouseWheelEventArgs e) 7{ 8 if (Keyboard.Modifiers != ModifierKeys.Control) return; 9 Scale.Value += e.Delta > 0 ? 0.5 : -0.5; 10}
お願いします。
2019/0907 追記
ViewBox の子にリッチテキストボックスを置くとリッチテキストボックスがかなり拡大されたような感じになります。
今のアプリケーションの組み方が悪いのかな?と思ったのでプレーンなWPFプロジェクトを作成しなおしてみましたが、同じでした。
ViewBoxに対して明示的な幅を示してやらないとこのようになるみたいですが、可変的な幅・高さになるので今回の例でViewBoxは使用できなさそうです。
あなたの回答
tips
プレビュー