Visual Basic .NET Language
WinForms SpellCheckBox
Suche…
Einführung
Beispiel zum Hinzufügen eines Kontrollkästchens für eine Rechtschreibprüfung zu einer WindowsForms-Anwendung. In diesem Beispiel ist weder eine Installation von Word noch eine Verwendung von Word erforderlich.
Es verwendet WPF-Interop mit dem ElementHost-Steuerelement, um ein WPF UserControl aus einer WPF-TextBox zu erstellen. WPF TextBox verfügt über eine integrierte Funktion zur Rechtschreibprüfung. Wir werden diese eingebaute Funktion nutzen, anstatt uns auf ein externes Programm zu verlassen.
ElementHost WPF TextBox
Dieses Beispiel ist einem Beispiel nachempfunden, das ich im Internet gefunden habe. Ich kann den Link nicht finden, oder ich würde dem Autor eine Anerkennung geben. Ich nahm das gefundene Muster und modifizierte es für meine Bewerbung.
- Fügen Sie die folgenden Referenzen hinzu:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase und WindowsFormsIntegration
Erstellen Sie eine neue Klasse und fügen Sie diesen Code ein
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
Erstellen Sie die Lösung neu.
Fügen Sie ein neues Formular hinzu.
Durchsuchen Sie die Toolbox nach Ihrem Klassennamen. Dieses Beispiel ist "Rechtschreibprüfung". Es sollte unter "YourSoulutionName" -Komponenten aufgeführt sein.
Ziehen Sie das neue Steuerelement in Ihr Formular
Legen Sie alle zugeordneten Eigenschaften im Formularereignis zum Laden von Formularen fest
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
- Das letzte, was Sie tun müssen, ist die DPI-Kenntnis Ihrer Anwendung zu ändern. Dies ist darauf zurückzuführen, dass Sie die WinForms-Anwendung verwenden. Standardmäßig sind alle WinForms-Anwendungen DPI UNAWARE. Wenn Sie ein Steuerelement ausführen, das über einen Elementhost (WPF-Interop) verfügt, wird die Anwendung jetzt DPI AWARE. Dies kann mit Ihren Benutzeroberflächenelementen verwechseln. Die Lösung dafür ist, die Anwendung zu ERWERBEN, um DPI UNAWARE zu werden. Es gibt zwei Möglichkeiten, dies zu tun. Die erste ist durch die Manifestdatei und die zweite besteht darin, sie hart in Ihr Programm einzugeben. Wenn Sie OneClick zum Bereitstellen Ihrer Anwendung verwenden, müssen Sie sie hart codieren, nicht die Manifestdatei verwenden, da andernfalls Fehler auftreten.
Die beiden folgenden Beispiele finden Sie im Folgenden: WinForms-Skalierung bei großen DPI-Einstellungen - ist das überhaupt möglich? Vielen Dank an Telerik.com für die großartige Erklärung zu DPI.
Fest codierter DPI-Code-Beispiel. Dies muss ausgeführt werden, bevor das erste Formular initialisiert wird. Ich platziere dies immer in der ApplicationEvents.vb-Datei. Sie können zu dieser Datei gelangen, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihren Projektnamen klicken und "Öffnen" wählen. Wählen Sie dann die Anwendungsregisterkarte links aus und klicken Sie unten rechts neben dem Begrüßungsbildschirm auf "Anwendungsereignisse anzeigen".
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
Manifestes Beispiel
<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>