Visual Basic .NET Language
WinForms SpellCheckBox
Recherche…
Introduction
Exemple sur la façon d'ajouter une case à cocher orthographique à une application WindowsForms. Cet exemple ne nécessite pas l'installation de Word, ni l'utilisation de Word.
Il utilise Interop WPF en utilisant le contrôle ElementHost pour créer un UserControl WPF à partir d'un TextBox WPF. WPF TextBox a une fonction intégrée pour la vérification orthographique. Nous allons exploiter cette fonction intégrée plutôt que de compter sur un programme externe.
ElementHost WPF TextBox
Cet exemple a été modélisé à partir d’un exemple trouvé sur Internet. Je ne peux pas trouver le lien ou je donnerais le crédit à l'auteur. J'ai pris l'échantillon que j'ai trouvé et l'ai modifié pour fonctionner pour mon application.
- Ajoutez les références suivantes:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase et WindowsFormsIntegration
Créer une nouvelle classe et passé ce code
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
Reconstruire la solution.
Ajouter un nouveau formulaire.
Recherchez la boîte à outils pour votre nom de classe. Cet exemple est "Vérification orthographique". Il devrait être listé sous les composants "YourSoulutionName".
Faites glisser le nouveau contrôle sur votre formulaire
Définissez l'une des propriétés mappées dans l'événement de chargement de formulaires
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
- La dernière chose à faire est de modifier la connaissance DPI de votre application. C'est parce que vous utilisez l'application WinForms. Par défaut, toutes les applications WinForms sont DPI UNAWARE. Une fois que vous exécutez un contrôle qui possède un hôte d'élément (WPF Interop), l'application devient désormais DPI AWARE. Cela peut ou peut ne pas gâcher vos éléments d'interface utilisateur. La solution consiste à forcer l'application à devenir DPI UNAWARE. Il y a 2 façons de le faire. Le premier est à travers le fichier manifeste et le second à le coder en dur dans votre programme. Si vous utilisez OneClick pour déployer votre application, vous devez le coder en dur, ne pas utiliser le fichier manifeste ou des erreurs inévitables.
Les deux exemples suivants peuvent être trouvés à l' adresse suivante: Mise à l'échelle WinForms à des paramètres DPI importants - Est-ce possible? Merci à Telerik.com pour l'excellente explication sur DPI.
Exemple de code DPI codé en dur. Ceci DOIT être exécuté avant que le premier formulaire ne soit initialisé. Je place toujours cela dans le fichier ApplicationEvents.vb. Vous pouvez accéder à ce fichier en cliquant avec le bouton droit sur le nom de votre projet dans l'explorateur de solutions et en choisissant "Ouvrir". Ensuite, choisissez l'onglet de l'application sur la gauche, puis cliquez sur "Afficher les événements de l'application" dans le coin inférieur droit de la liste déroulante de l'écran de démarrage.
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
Exemple de manifeste
<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>