2010-10-26 49 views
15

Estoy intentando usar la clase SpellCheck que C# proporciona (en PresentationFramework.dll). Pero, estoy experimentando problemas al tratar de obligar a la ortografía a mi caja de texto:Intentando usar la clase C# SpellCheck

SpellCheck.SetIsEnabled(txtWhatever, true); 

El problema es que mi txtWhatever es de tipo System.Windows.Forms y el parámetro de esta función está buscando es System.Windows .Controles, y la conversión simple falló. También intenté hacer mi TextBox de este tipo, pero ... no pude. ¿Alguien sabe cómo usar este objeto SpellCheck? (MSDN no era tan útil ...)

Gracias

Respuesta

42

Tienes que usar un WPF TextBox para que funcione la corrección ortográfica. Puede incrustar uno en un formulario de Windows Forms con el control ElementHost. Funciona de manera muy similar a UserControl. Aquí hay un control que puede colocar directamente desde la caja de herramientas. Para comenzar, necesita Project + Add Reference y seleccione WindowsFormsIntegration, System.Design y los ensamblados WPF PresentationCore, PresentationFramework y WindowsBase.

Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Compilar. Coloque el control SpellBox desde la parte superior de la caja de herramientas en un formulario. Admite el evento TextChanged y las propiedades Multiline y WordWrap. Hay un problema persistente con la Fuente, no hay una manera fácil de asignar una Fuente WF a las propiedades de fuente WPF. La solución más fácil para eso es establecer la fuente del formulario en "Segoe UI", el valor predeterminado para 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, una versión de este código VB.NET que evita la 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 
+0

Estoy tratando de implementar su solución: ¿Qué significa la parte (s, e) del código? Porque estoy obteniendo un error de compilación para eso? – Assaf

+0

Es una expresión lambda, se requiere VS2008. Simplemente elimínelo y deje que intellisense agregue un método regular en su lugar. –

+0

Erm, pensándolo bien, ¿tiene que tener VS2008 si usa WPF? –

0

¿Usted ha intentado sólo la creación de la propiedad en el cuadro de texto real de su intento de revisar la ortografía. p.ej.

txtWhatever.SpellCheck.IsEnabled = true; 
+0

Sí, lo intenté. System.Windows.Forms no tiene esta propiedad probablemente. Este es exactamente mi problema ... – Assaf

+0

De todos modos, gracias por probar – Assaf

0

Está intentando utilizar un componente de revisión ortográfica diseñado para WPF en una aplicación WinForms. Ellos son incompatibles.

Si desea utilizar la revisión ortográfica proporcionada por .NET, tendrá que usar WPF como su sistema de widgets.

Si desea seguir con WinForms, necesitará un componente de revisión ortográfica de terceros.

-1

lo que de conseguir una lista de palabras en el idioma Inglés y la copia que a un archivo de texto. agrega la referencia. luego usa la clase streamreader para analizar la lista en contra de textbox.text. las palabras que no se encuentran en el archivo de texto se pueden configurar para resaltarlas o mostrarlas en un cuadro de diálogo con opciones para reemplazar o ignorar. esta es una sugerencia de escopeta con muchos pasos faltantes y tengo 2 meses en la programación, pero ... es lo que voy a intentar de todos modos. Estoy haciendo un proyecto de bloc de notas (rexpad en idreamincode.com). espero que esto haya ayudado!

+0

Esto es más un comentario que una respuesta. ¿Leíste la respuesta aceptada? –

0

Se puede ver el corrector ortográfico .NET gratuito basado en un cuadro de texto WPF que se puede utilizar en el lado del cliente o del servidor here. Envolverá el cuadro de texto para usted aunque todavía necesite el ensamblaje incluye el marco de presentación, etc.

Revelación completa ...escrito por su servidor

0

que necesitaba para añadir un color de fondo al cuadro de texto en Windows Forms que reflejaban el color seleccionado en el diseñador:

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