방법: 상황에 맞는 메뉴로 맞춤법 검사 사용
기본적으로 TextBox나 RichTextBox 같은 편집 컨트롤에서 맞춤법 검사를 사용하도록 설정하거나 상황에 맞는 메뉴에서 맞춤법 검사를 선택할 수 있습니다. 예를 들어 사용자가 맞춤법이 틀린 단어를 마우스 오른쪽 단추로 클릭하면 맞춤법 제안 모음이나 모두 무시 옵션이 표시됩니다. 그러나 사용자 지정 상황에 맞는 메뉴를 이용해 기본 상황에 맞는 메뉴를 재정의하면 이 기능이 사라지고, 상황에 맞는 메뉴에서 맞춤법 검사 기능을 다시 사용하도록 설정하는 코드를 작성해야 합니다. 다음 예제에서는 TextBox에서 이를 사용하도록 설정하는 방법을 보여 줍니다.
상황에 맞는 메뉴 정의
다음 예제에서는 상황에 맞는 메뉴를 구현하는 데 사용하는 일부 이벤트를 이용해 TextBox를 만드는 XAML(Extensible Application Markup Language)을 보여 줍니다.
<Page x:Class="SDKSample.SpellerCustomContextMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://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;
}
}
}
Namespace SDKSample
Partial Public Class SpellerCustomContextMenu
Inherits Page
Private Sub OnWindowLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
'This is required for the first time ContextMenu invocation
'so that TextEditor doesnt handle it.
myTextBox.ContextMenu = GetContextMenu()
End Sub
Private Sub tb_ContextMenuOpening(ByVal sender As Object,
ByVal e As RoutedEventArgs)
Dim caretIndex, cmdIndex As Integer
Dim spellingError As SpellingError
myTextBox.ContextMenu = GetContextMenu()
caretIndex = myTextBox.CaretIndex
cmdIndex = 0
spellingError = myTextBox.GetSpellingError(caretIndex)
If spellingError IsNot Nothing Then
For Each str As String In spellingError.Suggestions
Dim mi As 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 += 1
Next str
Dim separatorMenuItem1 As New Separator()
myTextBox.ContextMenu.Items.Insert(cmdIndex, separatorMenuItem1)
cmdIndex += 1
Dim ignoreAllMI As New MenuItem()
ignoreAllMI.Header = "Ignore All"
ignoreAllMI.Command = EditingCommands.IgnoreSpellingError
ignoreAllMI.CommandTarget = myTextBox
myTextBox.ContextMenu.Items.Insert(cmdIndex, ignoreAllMI)
cmdIndex += 1
Dim separatorMenuItem2 As New Separator()
myTextBox.ContextMenu.Items.Insert(cmdIndex, separatorMenuItem2)
End If
End Sub
' Gets a fresh context menu.
Private Function GetContextMenu() As ContextMenu
Dim cm As New ContextMenu()
'Can create STATIC custom menu items if exists here...
Dim m1, m2, m3, m4 As MenuItem
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
End Function
End Class
End Namespace
RichTextBox를 이용해 이 작업을 수행하는 데 사용하는 코드와 비슷합니다. 주요 차이점은 GetSpellingError
메서드에 전달되는 매개 변수입니다. TextBox의 경우에는 caret 위치의 정수 인덱스를 전달합니다.
spellingError = myTextBox.GetSpellingError(caretIndex);
RichTextBox의 경우에는 caret 위치를 지정하는 TextPointer를 전달합니다.
spellingError = myRichTextBox.GetSpellingError(myRichTextBox.CaretPosition);
참고 항목
.NET Desktop feedback