拼写检查只替换TextBox中的第一个单词

时间:2012-12-23 16:52:46

标签: c# wpf textbox spell-checking

我知道我在某个地方之前已经看过这个问题,但我不确定当时是否有答案。我正在尝试将SpellCheck添加到WPF,.NET 4.0中的TextBox。它在查找和标记不正确的单词方面工作正常,如果不正确,将替换TextBox中的第一个单词。虽然过去的第一句话,它只是将克拉移动到TextBox的开头而没有改变任何东西?正如我所说,我在大约6-9个月前看到过这个地方,但现在我在谷歌处理的所有内容都与其他语言交易(我现在严格保留英语)。我已经包含了事件方法和样式XAML只是为了完整性,我不认为问题就在那里。

XAML:

<MultiBox:MultiBox Name="callNotes" Grid.Column="1" Width="Auto" Height="Auto" Margin="2,5,15,20" VerticalAlignment="Stretch" AcceptsReturn="True" FontWeight="Bold" GotFocus="callNotes_GotFocus" SelectAllOnGotFocus="False" SpellCheck.IsEnabled="True" xml:lang="en-US" Style="{StaticResource TextBoxStyle}" TextChanged="callNotes_TextChanged" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" />

<Style x:Key="TextBoxStyle" TargetType="{x:Type MyNamespace:MultiBox}">
    <Setter Property="CharacterCasing" Value="Upper" />
    <Setter Property="HorizontalAlignment" Value="Stretch" />
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="Height" Value="23" />
    <Setter Property="Width" Value="Auto" />
    <Setter Property="SelectAllOnGotFocus" Value="True" />
    <Setter Property="TextWrapping" Value="Wrap" />
</Style>

代码:

private void callNotes_TextChanged(object sender, TextChangedEventArgs e)
{
    callNotes.Text.ToUpper();
    lineCountOne.Content = ((callNotes.Text.Length / 78) + 1);
}

private void callNotes_GotFocus(object sender, RoutedEventArgs e)
{
    callNotes.CaretIndex = callNotes.Text.Length;
}

2 个答案:

答案 0 :(得分:1)

查看试图纠正错误的代码会有所帮助。这是一个简单的代码,它遍历所有检测到的错误并接受第一个建议。如果您只想修复特定错误,则需要通过在某个索引处获取错误来跳过您感兴趣的特定错误。

        int ndx;
        while ((ndx = callNotes.GetNextSpellingErrorCharacterIndex(0, LogicalDirection.Forward)) != -1) 
        {
            var err = callNotes.GetSpellingError(ndx);
            foreach (String sugg in err.Suggestions)
            {
                err.Correct(sugg);
                break;
            }
        }

答案 1 :(得分:1)

在尝试了jschroedl的建议并且仍然没有运气之后(虽然我确实知道他的回答应该是正确的),但我开始玩我能想到的每一个可能的设置,甚至到了使用单个Spellcheck启用TextBox创建一个全新的WPF项目,以确保它不是Visual Studio / .NET安装本身的东西。事实证明它不是,这是我几个月前做的事情,以确保通过该程序选择任何给定的TextBox将导致SelectAll()方法被触发。一旦我从那段代码中筛选出这个特定的TextBox,一切都很棒。再次,感谢jschroedl,我知道他无法知道这一点。如果有人遇到类似问题,则会出现违规代码。

    protected override void OnStartup(StartupEventArgs e)
    {
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.GotKeyboardFocusEvent, new RoutedEventHandler(SelectAllText), true);

        base.OnStartup(e);
    }

    protected static void SelectAllText(object sender, RoutedEventArgs e)
    {
        var textBox = e.OriginalSource as TextBox;
        if (textBox != null && textBox.Name != "callNotes")
            textBox.SelectAll();
    }

添加&amp;&amp; textBox.Name!=“callNotes”解决了这个问题。