Visual Basic .NET Language
WinForms SpellCheckBox
Buscar..
Introducción
Ejemplo sobre cómo agregar una casilla de verificación de ortografía a una aplicación de WindowsForms. Este ejemplo NO requiere que Word esté instalado ni utiliza Word de ninguna manera.
Utiliza WPF Interop utilizando el control ElementHost para crear un UserPtrol de WPF desde un TextBox de WPF. WPF TextBox tiene una función incorporada para la revisión ortográfica. Vamos a aprovechar esta función incorporada en lugar de confiar en un programa externo.
ElementHost WPF TextBox
Este ejemplo fue modelado después de un ejemplo que encontré en internet. No puedo encontrar el enlace o le daría crédito al autor. Tomé la muestra que encontré y la modifiqué para que funcione para mi aplicación.
- Agregue las siguientes referencias:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase y WindowsFormsIntegration
Crea una nueva clase y pasa este código
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 SpellCheckBox Inherits ElementHost Private box As TextBox 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 <DefaultValue("")> _ 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(True)> _ Public Property MultiLine() As Boolean Get Return box.AcceptsReturn End Get Set(ByVal value As Boolean) box.AcceptsReturn = value End Set End Property <DefaultValue(True)> _ Public Property WordWrap() As Boolean Get Return box.TextWrapping <> TextWrapping.Wrap 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 End Class
Reconstruye la solución.
Añadir un nuevo formulario.
Busca en la caja de herramientas el nombre de tu clase. Este ejemplo es "SpellCheck". Debería aparecer en la lista debajo de los componentes de 'YourSoulutionName'.
Arrastra el nuevo control a tu formulario.
Establecer cualquiera de las propiedades asignadas en el evento de carga de formularios
Private Sub form1_Load(sender As Object, e As EventArgs) Handles Me.Load
spellcheckbox.WordWrap = True
spellcheckbox.MultiLin = True
'Add any other property modifiers here...
End Sub
- Lo último que debe hacer es cambiar el conocimiento de DPI de su aplicación. Esto se debe a que está utilizando la aplicación WinForms. Por defecto, todas las aplicaciones de WinForms son DPI UNAWARE. Una vez que ejecute un control que tenga un elemento host (interoperabilidad WPF), la aplicación ahora se convertirá en DPI AWARE. Esto puede o no desordenar con sus elementos UI. La solución a esto es FORZAR la aplicación para que se convierta en DPI UNAWARE. Hay 2 formas de hacer esto. El primero es a través del archivo de manifiesto y el segundo es codificarlo en su programa. Si está utilizando OneClick para implementar su aplicación, debe codificarla, no usar el archivo de manifiesto o los errores serán inevitables.
Los dos ejemplos siguientes se pueden encontrar en los siguientes: Escala de WinForms en la configuración de DPI grande: ¿es posible incluso? Gracias a Telerik.com por la gran explicación sobre DPI.
Código codificado duro Ejemplo de código Aware. Esto DEBE ejecutarse antes de que se inicialice la primera forma. Siempre coloco esto en el archivo ApplicationEvents.vb. Puede acceder a este archivo haciendo clic derecho en el nombre de su proyecto en el explorador de soluciones y seleccionando "Abrir". Luego, elija la pestaña de la aplicación a la izquierda y luego haga clic en "Ver eventos de la aplicación" en la esquina inferior derecha al lado del menú desplegable de la pantalla de bienvenida.
Namespace My
' The following events are available for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Enum PROCESS_DPI_AWARENESS
Process_DPI_Unaware = 0
Process_System_DPI_Aware = 1
Process_Per_Monitor_DPI_Aware = 2
End Enum
Private Declare Function SetProcessDpiAwareness Lib "shcore.dll" (ByVal Value As PROCESS_DPI_AWARENESS) As Long
Private Sub SetDPI()
'Results from SetProcessDPIAwareness
'Const S_OK = &H0&
'Const E_INVALIDARG = &H80070057
'Const E_ACCESSDENIED = &H80070005
Dim lngResult As Long
lngResult = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware)
End Sub
Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup
SetDPI()
End Sub
End Namespace
Ejemplo de manifiesto
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>