簡體   English   中英

WPF RichTextBox中的拼寫檢查器

[英]Spell checker in a WPF RichTextBox

我已經創建了RichTextBox文本編輯器作為ac#Form應用程序解決方案。 我已將WPF應用程序添加到此解決方案中以充當拼寫檢查器。 基本上,當我運行拼寫檢查器時, RichTextBox的內容將復制到WPF應用程序中的WPF RichTextBox中,該應用程序已配置為看起來像拼寫檢查對話框。 我包括一個ListBox ,它顯示拼寫錯誤建議和按鈕,如果單擊其中一項建議,用戶可以忽略錯誤或進行更改。

主例程循環遍歷RichTextBox中的文本,直到找到拼寫錯誤為止。 然后,用戶可以選擇通過單擊調用EditingCommands.IgnoreSpellingError的按鈕來忽略,或者通過單擊調用EditingCommands.CorrectSpellingError的按鈕來進行EditingCommands.CorrectSpellingError 目前,我正在使用另一個按鈕,然后在RichTextBox重新循環以查找下一個拼寫錯誤。

理想情況下,例如,當我單擊忽略按鈕時,將EditingCommands.IgnoreSpellingError ,然后緊隨其后運行主例程,例如:

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        button3.Command = EditingCommands.IgnoreSpellingError;
        button3.CommandTarget = richTextBox1;
        spellCheckWords();
    }

但是,這不起作用,因為RichTextBox似乎與拼寫檢查器不同步。 好像表單或RichTextBox沒有正確刷新。 只是重申一下,如果我使用一個單獨的按鈕來重新運行主例程,那么它可以正常工作。

完整的代碼如下。

任何幫助,將不勝感激。

using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        richTextBox1.SpellCheck.IsEnabled = true;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        richTextBox1.Paste();
        richTextBox1.ContextMenu = GetContextMenu();
        spellCheckWords();
    }

    private static int chrPos = 0;

    private void spellCheckWords()
    {
        SpellingError spellingError;
        TextRange spellErrorRange;
        TextPointer start_pointer, end_pointer;

        richTextBox1.ContextMenu = GetContextMenu();
        richTextBox1.SelectAll();
        int txtLen = richTextBox1.Selection.Text.Length;
        bool noSpellingErrors = true; ;

        for (int i = chrPos; i < txtLen; i++)
        {
            start_pointer = richTextBox1.Document.ContentStart.GetNextInsertionPosition
                (LogicalDirection.Forward).GetPositionAtOffset(i, LogicalDirection.Forward);

            spellingError = richTextBox1.GetSpellingError(start_pointer);
            if (spellingError != null)
            {
                 spellErrorRange = richTextBox1.GetSpellingErrorRange(start_pointer);
                int errRange = spellErrorRange.Text.Length;

                textBox1.Text = spellErrorRange.Text;

                noSpellingErrors = true;
                string textRun = start_pointer.GetTextInRun(LogicalDirection.Forward);
                string trimmedString = string.Empty;
                end_pointer = richTextBox1.Document.ContentStart.GetNextInsertionPosition
                    (LogicalDirection.Forward).GetPositionAtOffset(i + errRange, LogicalDirection.Forward);
                richTextBox1.Selection.Select(start_pointer, start_pointer);
                richTextBox1.Focus();

                Rect screenPos = richTextBox1.Selection.Start.GetCharacterRect(LogicalDirection.Forward);
                double offset = screenPos.Top + richTextBox1.VerticalOffset;
                richTextBox1.ScrollToVerticalOffset(offset - richTextBox1.ActualHeight / 2);

                listBox1.Items.Clear();
                foreach (string str in spellingError.Suggestions)
                {
                    listBox1.Items.Add(str);
                }
                //chrPos = i + errRange + 1;
                return;
            }
        }
        if (noSpellingErrors == true) 
        { 
            textBox1.Text = "No spelling Errors";
            listBox1.Items.Clear();
            button2.IsEnabled = false;
            button3.IsEnabled = false;
            button4.IsEnabled = false;
            button6.IsEnabled = false;
        }
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        richTextBox1.SelectAll();
        richTextBox1.Copy();
        richTextBox1.Document.Blocks.Clear();
        richTextBox1.SpellCheck.IsEnabled = false;
        this.Close();
    }

    private ContextMenu GetContextMenu()
    {
        return null;
    }

    private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (listBox1.SelectedItem != null)
            textBox1.Text = listBox1.SelectedItem.ToString();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        button2.Command = EditingCommands.CorrectSpellingError;
        button2.CommandParameter = textBox1.Text;
        button2.CommandTarget = richTextBox1;
        spellCheckWords();
    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        button3.Command = EditingCommands.IgnoreSpellingError;
        button3.CommandTarget = richTextBox1;
        spellCheckWords();
    }

    private void button4_Click(object sender, RoutedEventArgs e)
    {
        spellCheckWords();
    }


}

}

一段時間后,我遇到了您的問題^^(我認為),而且很容易解決。

在Button-Click-events中,設置按鈕的命令和參數,然后執行spellCheckWords。 但是實際的命令是在代碼離開方法之后執行的。 也就是說,spellCheckWords()在IgnoreSpellingError之前執行。

將代碼更改為此:

        private void button2_Click(object sender, RoutedEventArgs e)
    {
        EditingCommands.CorrectSpellingError.Execute(textBox1.Text, richTextBox1);
        spellCheckWords();
    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        EditingCommands.IgnoreSpellingError.Execute(null, richTextBox1);
        spellCheckWords();
    }

這將首先執行命令,然后再次執行拼寫檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM