【WPF學習】第二十二章 文本控件


  WPF提供了三個用於輸入文本的控件:TextBox、RichTextBox和PasswordBox。PasswordBox控件直接繼承自Control類。TextBox和RichTextBox控件間接繼承自TextBoxBase類。

  與前面看到的內容控件不同,文本框能夠包含的內容類型是有限的。TextBox控件總是存儲字符串(由Text屬性提供)。PasswordBox控件也處理字符內容(由Password屬性提供),盡管為了減輕特定類型的攻擊,它在內部使用SecureString屬性。只有RichTextBox控件可存儲更復雜的內容:可包含復雜元素組合的FlowDocument對象。

一、多行文本

  TextBox控件通常存儲單行文本(可通過設置MaxLength屬性來限制字符的數量)。然而,在許多情況下需要處理大量內容,從而會希望創建多行文本框。對於這種情況,可將TextWrapping屬性設置為Wrap或WrapWithOverflow。如果將TextWrapping屬性設置為Wrap,那么總是會在控件的邊緣換行,設置將一個特別長的單詞放在兩行中。如果將TextWrapping屬性設置為WrapWithOverflow,這時如果換行算法沒有發現合適的位置(如空格或連字符)進行轉換行,就允許拉伸某些行使其超出右邊緣。

  為了能自動在文本框中看到多行文本,需將其尺寸設置的足夠大。不應該當設置硬編碼的高度(這樣不能適應不同的字體大小,而且可能導致布局問題),可使用方便的MinLines和MaxLines屬性。MinLines屬性是在文本框中必須顯示的最小行數。例如,如果MinLines屬性值為2,文本框的高度就會增大到至少兩行的高度。如果容器的空間不足,部分文本框可能會被裁減掉。MaxLines屬性設置文本框能夠顯示的最大行數。即使擴展文本框使其適合容器(例如,按比例改變尺寸的Grid控件的行或DockPanel中的最后一個元素),也不會超過這一限制。

  如果文本框支持換行,用戶可輸入更多能夠立即在可視行中顯示的文本。因此,通過將VerticalScrollBarVisibility屬性設置為Visible或Auto,添加始終顯示或按需顯示的滾動條是有意義的(也可設置HorizontalScrollBarVisibility屬性來顯示不常見的水平滾動條)。

  可能希望允許用戶在多行文本框中通過按下Enter鍵輸入硬回車(通常,在文本框中按下Enter鍵將觸發默認按鈕)。為確保文本框支持Enter鍵,需要將AcceptsReturn屬性設置為true。也可設置AcceptsTabs屬性,從而允許用戶插入Tab鍵。否則,Tab鍵會根據Tab鍵焦點順序將焦點移到下一個可得到焦點的控件上。

  有時,可能會創建純粹為了顯示文本的文本框。這是,可將IsReadOnly屬性設置為true以阻止編輯文本。最好通過將IsEnabled屬性設置為false來禁用文本框,因為禁用的文本框會顯示變灰的文本,不支持文本選擇(也不支持復制到剪切板),並且不支持滾動。

二、選擇文本

  在任何文本框中都可以通過單擊並拖動鼠標,或按住Shift鍵並使用方向鍵在文本中移動來選擇文本。TextBox類還提供了使用SelectionStart、SelectionLength以及SelectedText屬性,通過編程決定選擇哪些文本或改變當前所選文本的能力。

  SelectionStart屬性確定所選文本的開始位置,該位置是從0開始的。例如,如果將該屬性設置為10,選擇的第一個字符使文本框中的第11個字符。SelectionLength屬性指示選中的字符的總數量(0表示沒有選中字符)。最后,使用SelectedText屬性可快速檢查或改變在文本框中選中的文本。可通過處理SelectionChanged事件對文本選擇變化加以響應。

<Window x:Class="Controls.TextBoxTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TextBoxTest" Height="300" Width="300">
    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBox  Name="txt" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" AcceptsReturn="True"  
             SelectionChanged="txt_SelectionChanged"  
             SpellCheck.IsEnabled="True">The Ministry of Truth contained, it was said, three thousand rooms above ground level, and corresponding ramifications below. Scattered about London there were just three other buildings of similar appearance and size. So completely did they dwarf the surrounding architecture that from the roof of Victory Mansions you could see all four of them simultaneously. They were the homes of the four Ministries between which the entire apparatus of government was divided. The Ministry of Truth, which concerned itself with news, entertainment, education, and the fine arts. The Ministry of Peace, which concerned itself with war. The Ministry of Love, which maintained law and order. And the Ministry of Plenty, which was responsible for economic affairs. Their names, in Newspeak: Minitrue, Minipax, Miniluv, and Miniplenty.</TextBox>
        <ScrollViewer Foreground="Blue" Grid.Row="1" Margin="0,10,0,5" VerticalScrollBarVisibility="Auto">

            <StackPanel>
                <TextBlock>Current selection:</TextBlock>
                <TextBlock  Name="txtSelection" TextWrapping="Wrap"></TextBlock>
            </StackPanel>
        </ScrollViewer>

    </Grid>
</Window>
TextBoxTest
private void txt_SelectionChanged(object sender, RoutedEventArgs e)
        {
            if (txtSelection == null) return;
            txtSelection.Text = String.Format(
                "Selection from {0} to {1} is \"{2}\"",
                txt.SelectionStart, txt.SelectionLength, txt.SelectedText);
        }
SelectionChanged

 

   TextBox類還提供了可控制文本選擇行為的屬性AutoWordSelection。如果將該屬性設為true,那么當在文本中拖動鼠標時文本框每次會選擇整個單詞。

  TextBox控件的另一個有用功能是Undo,該功能允許用戶撤銷最近的操作。只要未將CanUndo屬性設置為false,就可通過代碼獲得Undo功能(調用Undo()方法),並使用Ctrl+Z快捷獲得該功能。

三、拼寫檢查

  TextBox提供了一個更特殊的功能——集成的拼寫檢查,該功能會在文本中無法識別的單詞下面添加偶那個色波浪下划線。用戶可右擊不能識別的單詞,並從可能正確的單詞列表中進行選擇。

  要為TextBox控件啟用拼寫檢查功能,值需設置SpellCheck.IsEnabled依賴項屬性即可,如下所示:

<TextBox SpellCheck.IsEnabled="True">...</TextBox>

  拼寫檢查是WPF的特有功能,該功能不依賴與其他軟件(如Office)。拼寫檢查根據為鍵盤配置的輸入語言來決定使用哪個字典。可通過TextBox控件的Language屬性重寫默認設置,該屬性繼承自FrameworkElement類,也可在<TextBox>元素中設置xml:lang特性。然而,WPF拼寫檢查目前只局限於4中語言:英語、西班牙語、法語和德語。可使用SpellingReform屬性設置是否將1990年之后對拼寫規則的修改應用於法語和德語中。

  WPF允許添加一系列被認為沒有拼寫錯誤的單詞(並將在適當的時候用作右擊建議)來自定義字典。為此,必須首先創建詞典文件,詞典文件不過是具有.lex擴張名的文本文件。在詞典文件中添加單詞列表。在單獨的行中放置每個單詞,單詞的順序沒有關系。

  一旦創建詞典文件,確保將TextBox控件的SpellCheck.IsEnabled屬性設置為true。最后使用SpellCheck.CustomDictionaries屬性關聯指向自定義詞典的Uri對象。如果選擇在XAML中指定Uri對象,那么首先必須導入System名稱空間,如下面的示例所示:

<Window x:Class="Controls.CustomSpellChecker"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=system"
        Title="CustomSpellChecker" Height="300" Width="300">
    <Grid Margin="5">
        <TextBox SpellCheck.IsEnabled="True" TextWrapping="Wrap" 
 Text="Now the spell checker recognizes acantholysis and offers the right correction for acantholysi">
            <SpellCheck.CustomDictionaries>
                <sys:Uri>pack://application:,,,/Controls;component/CustomWords.lex</sys:Uri>
            </SpellCheck.CustomDictionaries>
        </TextBox>

    </Grid>
</Window>
CustomSpellChecker

四、PasswordBox

  PasswordBox看起來與TextBox類似,但它通過顯示圓圈符號字符串來屏蔽實際字符(可通過設置PasswordChar屬性選擇不同的屏蔽字符)。此外,PassworBox控件不支持剪切板,從而不能復制內部的文本。

  與TextBox類相比,PassworBox的用戶界面更精簡。與TextBox類非常相似,它提供了MaxLength屬性;Clear()、Paste()以及SelectAll()方法;並且提供了當文本發生變化時觸發的事件(PasswordChanged事件)。TextBox類和PassworBox類最重要的區別在於內部的工作方式。盡管可使用Password屬性作為普通字符串讀取和設置文本,但在內部PasswordBox類只使用System.Security.SecureString對象。

  與普遍文本非常類似,SecureString是純文本對象。區別是在內存中的存儲方式。SecureString以加密方式在內存中保存。用於加密字符串的密鑰是隨機生成的,存儲在一塊從來不會寫入到磁盤的內存中。最終的結果即使計算機崩潰,惡意用戶也不可能通過檢查頁面文件來檢索密碼數據。即使找到,也只能找到加密版本。

  SecureString類還提供了根據需要丟棄內容的功能。當調用SecureString.Dispose()方法時,內存中的密碼數據就會被改寫。這樣可保證所有密碼信息從內存中被改寫擦除,並且不能再以任何方式使用。正如所期望的,當控件被銷毀時,PassworBox控件會自動為保存在內存中的SecureString對象調用Dispose()方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM