2

我知道我以前在某个地方看到过这个问题,但我不确定当时是否有答案。我正在尝试将 SpellCheck 添加到TextBoxWPF、.NET 4.0 中。它在查找和标记不正确的单词方面效果很好,TextBox如果它不正确,它将替换第一个单词。任何超过第一个单词的内容,它只是将克拉移动到开头TextBox而不改变任何内容?正如我所说,我在大约 6-9 个月前的某个地方看到了这个,但现在我在 google 中提出的所有内容都涉及替代语言(我现在严格使用英语)。我只是为了完整性而包含了事件方法和样式 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;
}
4

2 回答 2

1

在尝试了 jschroedl 的建议但仍然没有运气(尽管我知道他的回答应该是正确的)之后,我开始尝试我能想到的所有可能的设置,甚至到创建一个全新的 WPF 项目的地步,Spellcheck-启用TextBox只是为了确保它与 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();
    }

添加&& textBox.Name != "callNotes"解决了这个问题。

于 2012-12-27T07:27:55.470 回答
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;
            }
        }
于 2012-12-23T18:34:43.697 回答