Проверка правописания и класс PasswordBox

86

Проверка правописания

У элемента TextBox есть необычная возможность — встроенная проверка правописания, при которой нераспознанные слова подчеркиваются красной волнистой линией. Пользователь может щелкнуть правой кнопкой мыши на нераспознанном слове и выбрать из списка правильный вариант.

Чтобы включить функцию проверки правописания в элементе TextBox, нужно просто задать свойство зависимости SpellCheck.IsEnabled:

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

Проверка правописания встроена в WPF и не зависит от любого другого программного обеспечения (например, Office). Функция проверки правописания определяет необходимый словарь на основании выбранного пользователем языка ввода на клавиатуре.

Можно явно указать словарь с помощью свойства Language элемента TextBox, унаследованного от класса FrameworkElement, или с помощью атрибута xml:lang в элементе <TextBox>. Однако в настоящее время проверка правописания ограничена четырьмя языками: английским, испанским, французским и немецким. Для французского и немецкого языков можно с помощью свойства SpellingReform указать, применять ли правила орфографии, введенные после 1990 г.

Проверка правописания в TextBox

В предыдущих версиях WPF функция проверки правописания не поддерживала пользовательскую настройку. В WPF 4 можно добавить список слов, которые не следует считать ошибочными (они также, когда нужно, будут включаться в предлагаемые варианты исправления при щелчке правой кнопкой). Для этого необходимо вначале создать файл лексикона, который представляет собой просто текстовый файл с расширением .lex. Этот файл должен содержать список слов, по одному слову в строке в алфавитном порядке.

Можно указать, что лексикон должен применяться только к конкретному языку, добавив идентификатор локали. Вот как можно указать, что перечисленные слова должны использоваться, только если текущим языком является английский:

#LID 1033
acantholysis
atypia
bulla
chromonychia
dermatoscopy
desquamation
...

Кроме этого, поддерживаются идентификаторы локалей 3082 (испанский), 1036 (французский) и 1031 (немецкий).

Возможность добавления пользовательского словаря не предназначена для использования дополнительных языков. Она просто добавляет перечисленные слова в уже поддерживаемый язык (например, английский). Например, такой дополнительный словарь можно использовать для распознавания имен или медицинских терминов.

После создания файла лексикона проверьте свойство SpellCheck.IsEnabled для данного элемента TextBox: оно должно быть равно true. И теперь остается только с помощью свойства SpellCheck.CustomDictionaries прикрепить объект Uri, указывающий на пользовательский словарь. Если вы захотите указать его средствами XAML, как в нижеприведенном примере, вначале нужно импортировать пространство имен System, чтобы иметь возможность объявить объект Uri в разметке:

<Window xmlns:sys="clr-namespace:System;assembly=system" ... >

Класс PasswordBox

Элемент PasswordBox похож на элемент TextBox, однако он отображает строку символов-кружочков, скрывающих настоящие символы. (С помощью свойства PasswordChar можно выбрать другой скрывающий символ.) Кроме того, PasswordBox не поддерживает работу с буфером обмена, поэтому вы не сможете скопировать содержащийся в нем текст.

По сравнению с классом TextBox класс PasswordBox имеет более простой интерфейс. Как и TextBox, он содержит свойство MaxLength, методы Clear(), Paste() и SelectAll(), а также событие PasswordChanged, которое возникает в случае изменения текста. А главное отличие этого элемента управления от TextBox находится в его внутренностях. Свойство Password позволяет задать текст и прочитать его как обычную строку, но внутри элемент PasswordBox использует исключительно объект System.Security.String.

SecureString — это текстовый объект, подобный обычной строке, но он хранится в памяти в зашифрованном виде. Ключ, который используется для шифрования строки, генерируется случайным образом и хранится в той части памяти, которая никогда не записывается на диск. Поэтому даже если произойдет поломка компьютера, злоумышленники не смогут извлечь данные пароля из файла подкачки страниц. В крайнем случае они найдут лишь зашифрованную форму.

Класс SecureString также имеет возможность освобождения по запросу. При вызове метода SecureString.Dispose() данные пароля, находящиеся в памяти, перезаписываются. Это гарантирует, что вся информация о пароле будет стерта из памяти, и никто не сможет ею воспользоваться. Естественно, PasswordBox вызывает метод Dispose() для хранимого объекта SecureString при уничтожении элемента управления.

PasswordBox
Пройди тесты
Лучший чат для C# программистов