Можно ли добавить пользовательский словарь для проверки орфографии в стиль? - PullRequest
3 голосов
/ 02 апреля 2012

Я нашел множество сайтов, которые предоставляют примеры того, как добавить пользовательский словарь для проверки орфографии в отдельное текстовое поле, например:

<TextBox SpellCheck.IsEnabled="True" >
    <SpellCheck.CustomDictionaries>
        <sys:Uri>customdictionary.lex</sys:Uri>
    </SpellCheck.CustomDictionaries>
</TextBox>

И я проверил это в своем приложении, и оно отлично работает.

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

<Style TargetType="{x:Type TextBox}">
        <Setter Property="SpellCheck.IsEnabled" Value="True" />
</Style>

Я пытался сделать что-то подобное, чтобы добавить пользовательский словарь, но ему это не нравится, так как SpellCheck.CustomDictionaries только для чтения, а сеттеры принимают только доступные для записи свойства.

<Style TargetType="{x:Type TextBox}">
        <Setter Property="SpellCheck.IsEnabled" Value="True" />
        <Setter Property="SpellCheck.CustomDictionaries">
            <Setter.Value>
                <sys:Uri>CustomSpellCheckDictionary.lex</sys:Uri>
            </Setter.Value>
        </Setter>
</Style>

Я провел обширные поиски, чтобы найти ответ на этот вопрос, но во всех примерах показан только одноразовый сценарий в конкретном текстовом поле, как указано в первом блоке кода. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 18 июня 2012

У меня была та же проблема, и я не мог решить ее с помощью стиля, но создал некоторый код, который выполнил задание.

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

private static void FindAllChildren<T>(DependencyObject parent, ref List<T> list) where T : DependencyObject
{
    //Initialize list if necessary
    if (list == null)
        list = new List<T>();

    T foundChild = null;
    int children = VisualTreeHelper.GetChildrenCount(parent);

    //Loop through all children in the visual tree of the parent and look for matches
    for (int i = 0; i < children; i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        foundChild = child as T;

        //If a match is found add it to the list
        if (foundChild != null)
            list.Add(foundChild);

        //If this control also has children then search it's children too
        if (VisualTreeHelper.GetChildrenCount(child) > 0)
            FindAllChildren<T>(child, ref list);
    }
}

Затем, каждый раз, когда я открываю новую вкладку / окно в своем приложении, я добавляю обработчик к загруженному событию.

window.Loaded += (object sender, RoutedEventArgs e) =>
     {
         List<TextBox> textBoxes = ControlHelper.FindAllChildren<TextBox>((Control)window.Content);
         foreach (TextBox tb in textBoxes)
              if (tb.SpellCheck.IsEnabled)
                  Uri uri = new Uri("pack://application:,,,/MyCustom.lex"));
                       if (!tb.SpellCheck.CustomDictionaries.Contains(uri))
                           tb.SpellCheck.CustomDictionaries.Add(uri);
     };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...