Gewusst wie: Verwenden der Rechtschreibprüfung mit einem Kontextmenü
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.
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
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"