다음을 통해 공유


방법: 상황에 맞는 메뉴로 맞춤법 검사 사용

업데이트: 2007년 11월

기본적으로 TextBox 또는 RichTextBox와 같은 편집 컨트롤에서 맞춤법 검사를 사용하면 상황에 맞는 메뉴에 맞춤법 검사 옵션이 나타납니다. 예를 들어 사용자가 철자가 잘못된 단어를 마우스 오른쪽 단추로 클릭하면 철자 제안 단어 또는 모두 무시 옵션이 나타납니다. 하지만 기본으로 제공되는 상황에 맞는 메뉴를 사용자 지정 상황에 맞는 메뉴로 재정의하면 이 기능이 사라지므로 상황에 맞는 메뉴에 맞춤법 검사 기능이 다시 나타나도록 하려면 코드를 작성해야 합니다. 다음 예제에서는 TextBox에서 이 기능을 활성화하는 방법을 보여 줍니다.

예제

다음 예제에서는 상황에 맞는 메뉴를 구현하는 데 사용하는 몇 가지 이벤트로 TextBox를 만드는 XAML(Extensible Application Markup Language)을 보여 줍니다.

<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에 사용자 지정 컨텍스트 메뉴 사용

개념

TextBox 개요

RichTextBox 개요