C# 尝试使用C拼写检查类

C# 尝试使用C拼写检查类,c#,.net,winforms,textbox,spell-checking,C#,.net,Winforms,Textbox,Spell Checking,我正在尝试使用PresentationFramework.dll中提供的拼写检查类C。 但是,我在尝试将拼写绑定到文本框时遇到问题: SpellCheck.SetIsEnabled(txtWhatever, true); 问题是,我的TXT类型为System.Windows.Forms,此函数要查找的参数为System.Windows.Controls,简单转换失败。 我也试着制作这种类型的文本框,但是。。。不能。 有人知道如何使用这个拼写检查对象吗? MSDN没有那么大帮助 谢谢您尝试在您尝

我正在尝试使用PresentationFramework.dll中提供的拼写检查类C。 但是,我在尝试将拼写绑定到文本框时遇到问题:

SpellCheck.SetIsEnabled(txtWhatever, true);
问题是,我的TXT类型为System.Windows.Forms,此函数要查找的参数为System.Windows.Controls,简单转换失败。 我也试着制作这种类型的文本框,但是。。。不能。 有人知道如何使用这个拼写检查对象吗? MSDN没有那么大帮助


谢谢您尝试在您尝试拼写检查的实际文本框上设置属性。e、 g

txtWhatever.SpellCheck.IsEnabled = true;

您正在尝试在WinForms应用程序上使用为WPF设计的拼写检查组件。它们是不相容的

如果你想使用.NET提供的拼写检查,你必须使用WPF作为你的小部件系统


如果你想继续使用WinForms,你需要一个第三方拼写检查组件。

你必须使用WPF文本框来进行拼写检查。可以使用ElementHost控件将其嵌入Windows窗体中。它的工作原理非常类似于用户控件。这是一个可以直接从工具箱中删除的控件。要开始,您需要Project+添加引用并选择WindowsFormsIntegration、System.Design和WPF程序集PresentationCore、PresentationFramework和WindowsBase

向项目中添加一个新类并粘贴如下所示的代码。编写将拼写框控件从工具箱顶部拖到窗体上。它支持TextChanged事件以及多行和换行属性。字体存在一个令人困扰的问题,没有简单的方法将WF字体映射到WPF字体属性。最简单的解决方法是将表单的字体设置为SegoeUI,这是WPF的默认字体

using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
using System.Windows.Forms.Design;

[Designer(typeof(ControlDesigner))]
//[DesignerSerializer("System.Windows.Forms.Design.ControlCodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.Serialization.CodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
class SpellBox : ElementHost {
    public SpellBox() {
        box = new TextBox();
        base.Child = box;
        box.TextChanged += (s, e) => OnTextChanged(EventArgs.Empty);
        box.SpellCheck.IsEnabled = true;
        box.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
        this.Size = new System.Drawing.Size(100, 20);
    }
    public override string Text {
        get { return box.Text; }
        set { box.Text = value; }
    }
    [DefaultValue(false)]
    public bool Multiline {
        get { return box.AcceptsReturn; }
        set { box.AcceptsReturn = value; }
    }
    [DefaultValue(false)]
    public bool WordWrap {
        get { return box.TextWrapping != TextWrapping.NoWrap; }
        set { box.TextWrapping = value ? TextWrapping.Wrap : TextWrapping.NoWrap; }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public new System.Windows.UIElement Child {
        get { return base.Child; }
        set { /* Do nothing to solve a problem with the serializer !! */ }
    }
    private TextBox box;
}
根据流行需求,此代码的VB.NET版本避免了lambda:

Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Forms.Integration
Imports System.Windows.Forms.Design

<Designer(GetType(ControlDesigner))> _
Class SpellBox
    Inherits ElementHost

    Public Sub New()
        box = New TextBox()
        MyBase.Child = box
        AddHandler box.TextChanged, AddressOf box_TextChanged
        box.SpellCheck.IsEnabled = True
        box.VerticalScrollBarVisibility = ScrollBarVisibility.Auto
        Me.Size = New System.Drawing.Size(100, 20)
    End Sub

    Private Sub box_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
        OnTextChanged(EventArgs.Empty)
    End Sub

    Public Overrides Property Text() As String
        Get
            Return box.Text
        End Get
        Set(ByVal value As String)
            box.Text = value
        End Set
    End Property

    <DefaultValue(False)> _
    Public Property MultiLine() As Boolean
        Get
            Return box.AcceptsReturn
        End Get
        Set(ByVal value As Boolean)
            box.AcceptsReturn = value
        End Set
    End Property

    <DefaultValue(False)> _
    Public Property WordWrap() As Boolean
        Get
            Return box.TextWrapping <> TextWrapping.NoWrap
        End Get
        Set(ByVal value As Boolean)
            If value Then
                box.TextWrapping = TextWrapping.Wrap
            Else
                box.TextWrapping = TextWrapping.NoWrap
            End If
        End Set
    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows Property Child() As System.Windows.UIElement
        Get
            Return MyBase.Child
        End Get
        Set(ByVal value As System.Windows.UIElement)
            '' Do nothing to solve a problem with the serializer !!
        End Set
    End Property
    Private box As TextBox
End Class

获取英语单词列表并将其复制到文本文件怎么样。添加引用。然后使用streamreader类根据textbox.text分析列表。可以将文本文件中未找到的任何单词设置为高亮显示或显示在对话框中,并提供替换或忽略选项。这是一个有许多遗漏步骤的散弹枪建议,我编程已经2个月了,但……无论如何,这是我要尝试的。我正在idreamincode.com上制作一个记事本项目rexpad。希望这有帮助

免费的.NET拼写检查器,基于WPF文本框,可以在客户端或服务器端使用。它将为您包装文本框,尽管您仍然需要将程序集包括到表示框架等


完整披露…由您真挚撰写

我需要在winforms中的文本框中添加一个背景颜色,以反映设计师选择的颜色:

public override System.Drawing.Color BackColor
{
    get
    {
        if (box == null) { return Color.White; }
        System.Windows.Media.Brush br = box.Background;
        byte a = ((System.Windows.Media.SolidColorBrush)(br)).Color.A;
        byte g = ((System.Windows.Media.SolidColorBrush)(br)).Color.G;
        byte r = ((System.Windows.Media.SolidColorBrush)(br)).Color.R;
        byte b = ((System.Windows.Media.SolidColorBrush)(br)).Color.B;
        return System.Drawing.Color.FromArgb((int)a, (int)r, (int)g, (int)b);
    }
    set 
    {
        box.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(value.A, value.R, value.G, value.B));
    }
}

是的,我试过了。System.Windows.Forms可能没有此属性。这正是我的问题…我正在尝试实现您的解决方案:代码的s,e部分意味着什么?因为我得到了一个编译器错误?这对我不起作用,我不知道为什么。错误的单词不会划线。起初,编译器声称找不到程序集引用,只是添加了System.Xaml引用。但是这个咒语对我仍然不起作用:我错过了什么?当然那个文本框是你的拼写框。好的,我让它工作了我明确地设置了语言:box.language=System.Windows.Markup.XmlLanguage.GetLanguageen US;。您还需要安装.NET语言包,但我已经安装了。我不确定,但这个问题可能是因为英语不是我的操作系统语言。它起作用了:@Hans很好的例子,非常感谢。只是一个简单的问题,我们是否能够为您提供的示例向词典添加自定义词?@HansPassant-找到了答案。我需要动态地将事件添加到表单中。谢谢你的工作。这与其说是一个答案,不如说是一个评论。你读了被接受的答案了吗?