Tentando usar a class C # SpellCheck

Eu estou tentando usar a class SpellCheck C # fornece (em PresentationFramework.dll). Mas, estou com problemas ao tentar vincular a ortografia à minha checkbox de texto:

SpellCheck.SetIsEnabled(txtWhatever, true); 

O problema é que meu txtWhatever é do tipo System.Windows.Forms e o parâmetro que esta function está procurando é System.Windows.Controls, e a conversão simples falhou. Eu também tentei fazer meu TextBox deste tipo, mas … não podia. Alguém sabe como usar este object SpellCheck? (MSDN não foi tão útil …)

obrigado

Você tem que usar um TextBox WPF para fazer a verificação ortográfica funcionar. Você pode incorporar um em um formulário do Windows Forms com o controle ElementHost. Ele funciona muito semelhante a um UserControl. Aqui está um controle que você pode soltar diretamente da checkbox de ferramentas. Para começar, você precisa do Project + Add Reference e selecione WindowsFormsIntegration, System.Design e os assemblies do WPF PresentationCore, PresentationFramework e WindowsBase.

Adicione uma nova class ao seu projeto e cole o código mostrado abaixo. Compilar. Solte o controle SpellBox da parte superior da checkbox de ferramentas em um formulário. Suporta o evento TextChanged e as propriedades Multiline e WordWrap. Há um problema incômodo com a fonte, não há maneira fácil de mapear uma fonte WF para as propriedades de fonte WPF. A solução mais fácil para isso é definir a fonte do formulário para “Segoe UI”, o padrão para o 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; } 

Por demanda popular, uma versão VB.NET deste código que evita o 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  _ 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  _ Public Property MultiLine() As Boolean Get Return box.AcceptsReturn End Get Set(ByVal value As Boolean) box.AcceptsReturn = value End Set End Property  _ 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  _ 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 

Você já tentou apenas definir a propriedade no TextBox real sua tentativa de verificação ortográfica. por exemplo

 txtWhatever.SpellCheck.IsEnabled = true; 

Você está tentando usar um componente de verificação ortográfica projetado para o WPF em um aplicativo WinForms. Eles são incompatíveis.

Se você quiser usar a verificação ortográfica fornecida pelo .NET, você terá que usar o WPF como seu sistema de widgets.

Se você quiser ficar com o WinForms, você precisará de um componente de verificação ortográfica de terceiros.

O corretor ortográfico .NET livre baseado em uma checkbox de texto WPF que pode ser usada no lado cliente ou servidor pode ser visto aqui . Ele irá envolver a checkbox de texto para você, embora você ainda precise include a assembly na estrutura de Apresentação, etc.

Divulgação completa … escrita por você de verdade

Eu precisava adicionar uma cor de fundo à checkbox de texto em winforms que refletia a cor selecionada no designer:

 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)); } } 

Que tal obter uma lista de palavras no idioma Inglês e copiá-lo para um arquivo de texto. adicione a referência. em seguida, use a class streamreader para analisar a lista em relação ao textbox.text. qualquer palavra não encontrada no arquivo de texto pode ser definida para ser realçada ou exibida em uma checkbox de diálogo com opções para replace ou ignorar. Esta é uma sugestão de espingarda com muitos passos em falta e estou 2 meses em programação, mas …. é o que estou indo tentar de qualquer maneira. Eu estou fazendo um projeto de bloco de notas (rexpad em idreamincode.com). Espero que isso tenha ajudado!