2013-08-05 27 views
0

我在爲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手動完成。唯一的問題是這個意外的滾動問題偶爾會發生。

+0

請你能說幾句話,應該是什麼以及它應該如何工作? –

+0

當然。我會更詳細地編輯問題。 – Tom

+0

是的。我想禁用文本框中的滾動,或者學習如何設置文本的格式,使其出現在底部而不是一行的頂部。謝謝 – Tom

回答

1

我的問題改阿納託利提醒我以後不CanContentScroll使或者儘管它的名字禁止內容的滾動,而是通過像素滾動和項目滾動之間切換的意義。不過我的意圖是要停止TextBox完全內滾動行爲,而我現在已經解決了這個問題,並在ListBox也提高了滾動行爲,消除嵌套ScrollViewers收留他們:

首先,我發現this blog post這就解釋了爲什麼ScrollViewer總是處理MouseWheel。爲了防止這種情況,我可以繼承ScrollViewer的子類,直到我想知道爲什麼我不能將模板中的內容主機元素更改爲沒有滾動的內容,因爲我根本不需要它。 ContentPresenter沒有工作,但Important Note Box on this MSDN page提到TextBox只能與ScrollViewerAdornerDecorator一起使用。

切換到AdornerDecorator完美工作:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
      . . . 
      <AdornerDecorator x:Name="PART_ContentHost" 
           ClipToBounds="True" 
           Margin="{Binding GetTextOffset}" 
           /> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

我能夠保證金綁定到現有文字印性質和以前一樣定位文本,ClipToBounds侷限內容的可見區域。另一個主要的改進是滾動瀏覽ListBox中的這些文本框的集合,現在按預期工作,因爲文本框不再處理MouseWheel。嵌套的ScrollViewer令人不快。