Проверка орфографии Syncfusion WPF для нескольких элементов управления в окне - PullRequest
1 голос
/ 13 февраля 2020

Я смотрю, как изменить реализацию проверки орфографии на использование проверки орфографии Syncfusion. У меня это в основном работает, но есть один вопрос и одна проблема. Сначала мой код для тестового приложения. Я следовал примеру кода здесь и получил его, затем я хотел применить его к нескольким текстовым полям в одном окне, как это будет в моем реальном приложении. Последний раз я пытался активировать пользовательский словарь.

Вот мой код XAML для окна приложения:

<Window x:Class="SyncfusionWpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Icon="App.ico">
<Grid>
    <StackPanel>
        <TextBox Loaded="tb_Loaded" />
        <TextBox Loaded="tb_Loaded" />
        <TextBox Loaded="tb_Loaded" />
    </StackPanel>
</Grid>

Вот код:

using System.Windows;
using System.Windows.Controls;
using Syncfusion.Windows.Controls;

namespace SyncfusionWpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        void tb_Loaded(object sender, RoutedEventArgs e)
        {
            var spellChecker = new SfSpellChecker
            {
                CustomDictionaryPath =
                    @"C:\Users\sfaust\Source\Repos\SFTest1\SyncfusionWpfApp1\SyncfusionWpfApp1\bin\Debug\testdictionary.txt"
            };
            var textBoxSpellEditor = new TextBoxSpellEditor((TextBox)sender);
            spellChecker.PerformSpellCheckUsingContextMenu(textBoxSpellEditor);
        }
    }
}

Хорошо, так что первый вопрос. Когда я перешел к нескольким элементам управления, казалось, что это не сработало, если я не создал новую проверку орфографии и новый класс IEditorProperties (класс TextBoxSpellEditor) для каждого текстового поля и применил его (следовательно, инициализировал его в загруженном выше, а не в окне, как пример). Ну, это, кажется, работает, это кажется довольно неэффективным. В моем приложении может быть довольно много текстовых полей, так как они находятся в древовидном представлении элементов, поэтому я немного обеспокоен эффективностью создания сотен экземпляров проверки правописания (хотя я не пробовал стресс-тест может быть я обеспокоен излишне). Это правильный способ сделать это?

Второй вопрос - скорее проблема. Я не вижу ничего, указывающего на то, что пользовательский словарь работает. Я создал файл по указанному пути и поместил в него несколько случайных «слов», которые он идентифицировал (правильно) как неправильно написанные, но даже после помещения их в этот файл и установки свойства пути к словарю он все равно идентифицирует их как ошибочные. У меня также нет опции «AddToDictionary» в контекстном меню. Я также попытался установить свойство без фактического создания файла на тот случай, если он хочет создать сам файл, но без изменений. В последний раз я пробовал как относительные, так и абсолютные пути, но и без изменений. Что-то мне не хватает, как активировать пользовательский словарь?

1 Ответ

1 голос
/ 24 февраля 2020

Благодарим Вас за обращение в службу поддержки Syncfusion.

Запрос 1. После перехода к нескольким элементам управления казалось, что он работает неправильно, если я не создам новую проверку орфографии и новый IEditorProperties

Вместо того, чтобы каждый раз создавать новые экземпляры для SfSpellChecker вы можете передать текущий текстовый элемент управления в ControlToSpellCheck, который является свойством элемента управления. После этого вы можете позвонить PerformSpellCheckUsingContextMenu. Таким образом, вы можете получить результаты проверки орфографии с одним экземпляром.

private void OnGotFocus(object sender, RoutedEventArgs e) 
    { 
        TextBox textBox = sender as TextBox; 
        if (this.SpellEditor == null) 
        { 
            SpellEditor = new TextSpellEditor(textBox); 
        } 
        else 
            SpellEditor.ControlToSpellCheck = textBox; 
        SpellChecker.PerformSpellCheckUsingContextMenu(SpellEditor); 
    }

Запрос 2: Я не вижу ничего, указывающего на то, что пользовательский словарь работает

В SfSpellChecker в настоящее время у нас нет прямой поддержки загрузки файла словаря из вне приложения. Если вы хотите загрузить файл ресурсов в другом месте, мы можем добиться этого с помощью отражения и назначить словарь для проверки орфографии в соответствии с заданным фрагментом кода.

Например, если пользовательский словарь присутствует в этом месте. (D: \ CustomDictionary \ CustomDict.txt)

Пример кода [C #]

Stream fileStream = new FileStream(@"D:\CustomDictionary\CustomDict.txt", FileMode.Open); 
spellChecker.GetType().GetField("checker", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(spellChecker, new SpellCheckerBase(fileStream  ) );
...