Visual Basic .NET Language
WinForms SpellCheckBox
Sök…
Introduktion
Exempel på hur du lägger till en stavkryssruta i ett WindowsForms-program. Det här exemplet kräver INTE att Word ska installeras och använder inte Word på något sätt.
Den använder WPF Interop med ElementHost-kontrollen för att skapa en WPF UserControl från en WPF TextBox. WPF TextBox har en inbyggd funktion för stavningskontroll. Vi kommer att utnyttja denna inbyggda funktion snarare än att förlita oss på ett externt program.
ElementHost WPF TextBox
Detta exempel modellerades efter ett exempel som jag hittade på internet. Jag kan inte hitta länken eller så skulle jag ge författaren kredit. Jag tog provet som jag hittade och modifierade det för att fungera för min applikation.
- Lägg till följande referenser:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase och WindowsFormsIntegration
Skapa en ny klass och förbi denna kod
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
Ombygga lösningen.
Lägg till en ny form.
Sök i verktygslådan efter ditt klassnamn. Detta exempel är "Stavekontroll". Det bör listas under "YourSoulutionName" -komponenter.
Dra den nya kontrollen till ditt formulär
Ställ in någon av de mappade egenskaperna i formhastigheten
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
- Det sista du behöver göra är att ändra DPI-medvetenheten om din ansökan. Det beror på att du använder WinForms-applikationen. Som standard är alla WinForms-applikationer DPI UNAWARE. När du genomför en kontroll som har en elementvärd (WPF Interop) blir applikationen nu DPI AWARE. Detta kan kanske inte orka med dina UI-element. Lösningen på detta är att Tvinga ansökan att bli DPI UNAWARE. Det finns två sätt att göra detta. Den första går igenom manifestfilen och den andra är att koda in den till ditt program. Om du använder OneClick för att distribuera din ansökan måste du koda den, inte använda manifestfilen eller fel kommer att vara oundvikliga.
Båda följande exempel kan hittas på följande: WinForms-skalning vid stora DPI-inställningar - är det jämnt möjligt? Tack till Telerik.com för den fantastiska förklaringen på DPI.
Exempel på hårdkodad DPI Aware-kod. Detta MÅSTE köras innan den första formuläret initialiseras. Jag lägger alltid detta i filen ApplicationEvents.vb. Du kan komma till den här filen genom att högerklicka på ditt projektnamn i lösningsutforskaren och välja "Öppna". Välj sedan applikationsfliken till vänster och klicka sedan på "Visa applikationshändelser" längst ner till höger bredvid rullgardinsmenyn.
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 Exempel
<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>