Nasıl yapılır: Bağlam Menüsü ile Yazım Denetimi Kullanma

Varsayılan olarak, veya gibi bir Düzenle denetiminde yazım denetimini etkinleştirdiğinizde TextBoxRichTextBox , bağlam menüsünde yazım denetimi seçenekleri alırsınız. Örneğin, kullanıcılar yanlış yazılmış bir sözcüğe sağ tıkladıklarında, bir dizi yazım önerisi veya Tümünü yok saymaseçeneği alırlar. Bununla birlikte, kendi özel bağlam menünüzün varsayılan bağlam menüsünü geçersiz kıldığınızda, bu işlev kaybolur ve bağlam menüsündeki Yazım denetimi özelliğini yeniden etkinleştirmek için kod yazmanız gerekir. Aşağıdaki örnek, bir üzerinde bunun nasıl etkinleştirileceğini gösterir TextBox .

Örnek

Aşağıdaki örnek, TextBox bağlam menüsünü uygulamak için kullanılan bazı olaylar ile bir oluşturan Extensible Application Markup Language (XAML) gösterir.

<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>

Örnek

Aşağıdaki örnek, bağlam menüsünü uygulayan kodu gösterir.

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

Bunu ile yapmak için kullanılan kod RichTextBox benzerdir. Temel fark yöntemine geçirilen parametredir GetSpellingError . A için TextBox , giriş işareti konumunun tamsayı dizinini geçirin:

spellingError = myTextBox.GetSpellingError(caretIndex);

A için, RichTextBoxTextPointer şapka konumunu belirten bir geçirin:

spellingError = myRichTextBox.GetSpellingError(myRichTextBox.CaretPosition);

Ayrıca bkz.