Практическое руководство. Использование проверки орфографии при помощи контекстного меню
Обновлен: Ноябрь 2007
По умолчанию при включении проверки орфографии в редактируемом элементе управления, таком как TextBox или RichTextBox, варианты проверки орфографии отображаются в виде контекстного меню. Например, когда пользователь щелкает правой кнопкой слово с ошибкой, он получают набор орфографических вариантов или вариант Пропустить все. Однако при переопределении контекстного меню по умолчанию пользовательским контекстным меню эта функциональная возможность теряется и необходимо написать код для включения средства проверки орфографии в контекстном меню. В следующем примере показано, как это можно реализовать в объекте TextBox.
Пример
В следующем примере показан Язык XAML (Extensible Application Markup Language), создающий элемент управления TextBox с несколькими событиями, которые используются для реализации контекстного меню.
<Page x:Class="SDKSample.SpellerCustomContextMenu"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnWindowLoaded">
<TextBox
Name="myTextBox"
TextWrapping="Wrap"
SpellCheck.IsEnabled="True"
ContextMenuOpening="tb_ContextMenuOpening">
In a custum menu you need to write code to add speler choices
because everything in a custom context menu has to be added explicitly.
</TextBox>
</Page>
В следующем примере показан код, реализующий контекстное меню.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class SpellerCustomContextMenu : Page
{
void OnWindowLoaded(object sender, RoutedEventArgs e)
{
//This is required for the first time ContextMenu invocation so that TextEditor doesnt handle it.
myTextBox.ContextMenu = GetContextMenu();
}
void tb_ContextMenuOpening(object sender, RoutedEventArgs e)
{
int caretIndex, cmdIndex;
SpellingError spellingError;
myTextBox.ContextMenu = GetContextMenu();
caretIndex = myTextBox.CaretIndex;
cmdIndex = 0;
spellingError = myTextBox.GetSpellingError(caretIndex);
if (spellingError != null)
{
foreach (string str in spellingError.Suggestions)
{
MenuItem mi = new MenuItem();
mi.Header = str;
mi.FontWeight = FontWeights.Bold;
mi.Command = EditingCommands.CorrectSpellingError;
mi.CommandParameter = str;
mi.CommandTarget = myTextBox;
myTextBox.ContextMenu.Items.Insert(cmdIndex, mi);
cmdIndex++;
}
Separator separatorMenuItem1 = new Separator();
myTextBox.ContextMenu.Items.Insert(cmdIndex, separatorMenuItem1);
cmdIndex++;
MenuItem ignoreAllMI = new MenuItem();
ignoreAllMI.Header = "Ignore All";
ignoreAllMI.Command = EditingCommands.IgnoreSpellingError;
ignoreAllMI.CommandTarget = myTextBox;
myTextBox.ContextMenu.Items.Insert(cmdIndex, ignoreAllMI);
cmdIndex++;
Separator separatorMenuItem2 = new Separator();
myTextBox.ContextMenu.Items.Insert(cmdIndex, separatorMenuItem2);
}
}
// Gets a fresh context menu.
private ContextMenu GetContextMenu()
{
ContextMenu cm = new ContextMenu();
//Can create STATIC custom menu items if exists here...
MenuItem m1, m2, m3, m4;
m1 = new MenuItem();
m1.Header = "File";
m2 = new MenuItem();
m2.Header = "Save";
m3 = new MenuItem();
m3.Header = "SaveAs";
m4 = new MenuItem();
m4.Header = "Recent Files";
//Can add functionality for the custom menu items here...
cm.Items.Add(m1);
cm.Items.Add(m2);
cm.Items.Add(m3);
cm.Items.Add(m4);
return cm;
}
}
}
Код для элемента управления RichTextBox аналогичен. Главное различие состоит в параметре, передаваемом методу GetSpellingError. Для объекта TextBox передайте целочисленный индекс позиции каретки:
spellingError = myTextBox.GetSpellingError(caretIndex);
Для RichTextBox передайте объект TextPointer, задающий текущую позицию курсора:
spellingError = myRichTextBox.GetSpellingError(myRichTextBox.CaretPosition);
См. также
Задачи
Практическое руководство. Включение проверки орфографии в элементе управления редактирования текста
Практическое руководство. Использование пользовательского контекстного меню с элементом TextBox