我在爲TextBox
定製ControlTemplate
時遇到問題。這個想法是儘可能在儘可能少用戶交互的情況下自動在文字紙上打印文本,同時儘可能保持文本長度,字體大小等方面的靈活性。修改TextBox ControlTemplate以限制滾動,屬性設置在運行時不正確
爲此目的,一個設置是相對於文本高度一條印刷線(紙張上出現的線條有多近/多遠)。由於更改文本框LineHeight
會在文本下方添加空格,並且不會在上方添加空格,因此我一直使用文本框頂部的填充來向下翻譯文本。
只要指定的LineHeight大於文本框內剩餘的可見空間,就會導致出現問題。可能會無意中向下滾動到該行的底部,導致文本向上滾動到填充區域並消失。
爲了解決這個問題,我需要防止MouseWheel/PgUp/PgDwn在文本框內滾動,或者弄清楚如何沿着行的底部邊緣而不是頂部渲染文本。
使用Snoop,我發現TextBox控件有一個ScrollContentPresenter
,它的CanContentScroll屬性由它的ParentTemplate從ScrollViewer
確定。在Snoop中取消檢查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>
的風格是直接從微軟的WPFThemes/Aero.NormalColor.xaml解禁只有一個換向的ControlTemplate禁用滾動。對其他(省略)制定者的更改(如背景色)確實有效。我直接在TextBox中指定樣式,因爲它不會在其他任何地方使用,並假定本地樣式在隱式樣式之前,但我猜這可能不是正確的地方。
任何人都可以指出我在哪裏出錯,或確認是否有可能更改文本在一行上的呈現位置?
謝謝
編輯:這裏有一個什麼這個文本框其實就是做
假設你有一個文件的形式,如其中有一個幾個問題,每一個貸款或許可證申請一個更好的描述3個預先打印的線路,在其上寫你的答案。文本框:
- 的尺寸/定位成覆蓋整個答案區域
- 設置爲包含3行
- 賦予用戶字體大小,對準,字體選項
- 自動調整
LineHeight
到空間行均勻並設置Padding
將文本放置在打印線的正上方 - 即使文本輸入比預期的長,也不允許溢出。線的數量增加倍數(雙打,然後三元組等等)和字體大小被調整以試圖在所提供的空間中整齊地打印所有內容(例如,沒有由打印行劃掉的文本行)
實際上,這很好地工作非常並導致整齊的外觀形式,就好像有人用舊的Selectric手動完成。唯一的問題是這個意外的滾動問題偶爾會發生。
請你能說幾句話,應該是什麼以及它應該如何工作? –
當然。我會更詳細地編輯問題。 – Tom
是的。我想禁用文本框中的滾動,或者學習如何設置文本的格式,使其出現在底部而不是一行的頂部。謝謝 – Tom