Gewusst wie: Verwenden der Rechtschreibprüfung mit einem Kontextmenü

Aktualisiert: November 2007

Wenn Sie die Rechtschreibprüfung in einem Bearbeitungssteuerelement wie TextBox oder RichTextBox aktivieren, werden die Optionen standardmäßig im Kontextmenü angezeigt. Beispiel: Wenn ein Benutzer mit der rechten Maustaste auf ein falsch geschriebenes Wort klickt, werden Rechtschreibvorschläge und die Option Alle ignorieren angezeigt. Wenn Sie jedoch das Standardkontextmenü mit einem selbst erstellten Kontextmenü überschreiben, ist diese Funktion nicht mehr verfügbar, und Sie müssen Code schreiben, um die Rechtschreibprüfung im Kontextmenü erneut zu aktivieren. Das folgende Beispiel zeigt, wie Sie dieses für ein TextBox aktivieren.

Beispiel

Im folgenden Beispiel wird mit Extensible Application Markup Language (XAML) ein TextBox mit einigen Ereignissen erstellt, die zur Implementierung des Kontextmenüs dienen.

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

Das folgende Beispiel zeigt den Code zur Implementierung des Kontextmenüs.

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

    }
}

Der für die Variante mit einem RichTextBox verwendete Code ist ähnlich. Der Hauptunterschied besteht in dem Parameter, der an die GetSpellingError-Methode übergeben wird. Übergeben Sie für ein TextBox den ganzzahligen Index der Caretposition:

spellingError = myTextBox.GetSpellingError(caretIndex);

Übergeben Sie für ein RichTextBox den TextPointer, der die Caretposition angibt:

spellingError = myRichTextBox.GetSpellingError(myRichTextBox.CaretPosition);

Siehe auch

Aufgaben

Gewusst wie: Aktivieren der Rechtschreibprüfung in einem Textbearbeitungssteuerelement

Gewusst wie: Verwenden eines benutzerdefinierten Kontextmenüs mit "TextBox"

Konzepte

Übersicht über TextBox

Übersicht über RichTextBox