Visual Basic .NET Language
WinForms SpellCheckBox
Zoeken…
Invoering
Voorbeeld van het toevoegen van een spellingsvakje aan een WindowsForms-toepassing. In dit voorbeeld hoeft Word NIET te worden geïnstalleerd en wordt Word op geen enkele manier gebruikt.
Het maakt gebruik van WPF Interop met behulp van het besturingselement ElementHost om een WPF UserControl te maken op basis van een WPF TextBox. WPF TextBox heeft een ingebouwde functie voor spellingcontrole. We gaan deze ingebouwde functie gebruiken in plaats van te vertrouwen op een extern programma.
ElementHost WPF TextBox
Dit voorbeeld is gemodelleerd naar een voorbeeld dat ik op internet heb gevonden. Ik kan de link niet vinden of ik zou de auteur de eer geven. Ik nam het monster dat ik vond en paste het aan om voor mijn toepassing te werken.
- Voeg de volgende referenties toe:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase en WindowsFormsIntegration
Maak een nieuwe klasse en plak deze 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
Bouw de oplossing opnieuw op.
Voeg een nieuw formulier toe.
Zoek in de toolbox naar uw klassenaam. Dit voorbeeld is "Spellingcontrole". Het moet worden vermeld onder de componenten 'YourSoulutionName'.
Sleep het nieuwe besturingselement naar uw formulier
Stel een van de toegewezen eigenschappen in de form load-gebeurtenis in
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
- Het laatste wat u moet doen, is de DPI-bewustwording van uw toepassing wijzigen. Dit komt omdat u de WinForms-toepassing gebruikt. Standaard zijn alle WinForms-toepassingen DPI UNAWARE. Nadat u een besturingselement met een elementhost (WPF Interop) hebt uitgevoerd, wordt de toepassing nu DPI AWARE. Dit kan al dan niet knoeien met uw UI-elementen. De oplossing hiervoor is om de applicatie te dwingen DPI UNAWARE te worden. Er zijn 2 manieren om dit te doen. De eerste is via het manifestbestand en de tweede is om het hard in uw programma te coderen. Als u OneClick gebruikt om uw toepassing te implementeren, moet u deze hard coderen, het manifestbestand niet gebruiken, anders zijn fouten onvermijdelijk.
Beide van de volgende voorbeelden zijn te vinden op de volgende: WinForms Scaling bij grote DPI-instellingen - is het zelfs mogelijk? Met dank aan Telerik.com voor de geweldige uitleg over DPI.
Hard gecodeerd DPI Aware-codevoorbeeld. Dit MOET worden uitgevoerd voordat het eerste formulier wordt geïnitialiseerd. Ik plaats dit altijd in het ApplicationEvents.vb-bestand. U kunt dit bestand openen door met de rechtermuisknop op uw projectnaam te klikken in de oplossingsverkenner en "Openen" te kiezen. Kies vervolgens het applicatietabblad aan de linkerkant en klik vervolgens op "View Application Events" rechtsonder naast het dropdown-scherm.
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
Manifest voorbeeld
<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>