の のカスタマイズに問題がControlTemplate
ありTextBox
ます。テキストの長さ、フォント サイズなどに関して可能な限り柔軟性を保ちながら、ユーザーの操作をできるだけ少なくして、罫線付きの用紙にテキストを自動的にきれいに印刷することを目的としています。
そのための設定の 1 つは、印刷された行に対するテキストの高さです (紙に表示される行にどれだけ近いか、またはどれだけ上に表示されるか)。TextBox を変更するLineHeight
と、テキストの上ではなく下にスペースが追加されるため、テキスト ボックスの上部で Padding を使用してテキストを下に翻訳しています。
これにより、指定された LineHeight がテキスト ボックス内の残りの表示スペースよりも大きい場合に問題が発生します。うっかり行の一番下までスクロールしてしまい、テキストがパディングされた領域までスクロールアップして消えてしまう可能性があります。
これを修正するには、MouseWheel/PgUp/PgDwn がテキスト ボックス内でスクロールするのを防ぐか、行の上端ではなく下端に沿ってテキストをレンダリングする方法を理解する必要があります。
Snoop を使用して、TextBox コントロールに、ScrollContentPresenter
その CanContentScroll プロパティが の ParentTemplate によって決定される があることがわかりましたScrollViewer
。アプリケーションの実行中にスヌープのチェックCanContentScroll
を外すと、スクロールが無効になり、この動作が思い通りに防止されますが、何らかの理由CanContentScroll = False
でテンプレートでの指定が機能します。残っていTrue
ます。
XAML:
<TextBox.Style>
<Style TargetType="TextBoxBase">
. . .
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<theme:ListBoxChrome x:Name="Bd" . . . >
<ScrollViewer x:Name="PART_ContentHost"
CanContentScroll="False"/>
</theme:ListBoxChrome>
. . .
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
スタイルは Microsoft の WPFThemes/Aero.NormalColor.xaml から直接持ち上げられ、スクロールを無効にするために controltemplate に 1 つの変更を加えるだけです。背景色などの他の(省略された)セッターへの変更は機能しました。他の場所では使用されず、ローカル スタイルが暗黙的なスタイルよりも前にあると想定しているため、TextBox で直接スタイルを指定しましたが、これはこれを行うのに適切な場所ではない可能性があると推測しています。
これでどこが間違っているかを指摘したり、テキストが行のどこにレンダリングされるかを変更できるかどうかを確認したりできますか?
ありがとうございました
編集:これは、この TextBox が実際に行っていることのより良い説明です
ローンや許可の申請書など、いくつかの質問があり、それぞれに回答を記入するための 3 行が事前に印刷されている紙のフォームがあるとします。テキストボックス:
- 回答エリア全体をカバーするサイズ/配置
- 3行を含むように設定されています
- ユーザーにフォント サイズ、配置、書体のオプションを提供します
LineHeight
行間が均等になるように自動的に調整しPadding
、印刷された行のすぐ上にテキストを配置するように設定します- テキスト入力が予想よりも長くても、オーバーフローを許可しません。行数は倍数で増加し (2 倍、3 倍など)、指定されたスペースにすべてがきれいに印刷されるようにフォント サイズが調整されます (たとえば、印刷された行によってテキストの行が消されないようにします)。
実際には、これは非常にうまく機能し、まるで誰かが古い Selectric を使って手作業で行ったかのように、きちんとした外観のフォームが得られます。唯一の問題は、この偶発的なスクロールの問題が時々発生することです。