Visual Basic .NET Language
WinForms SpellCheckBox
Szukaj…
Wprowadzenie
Przykład dodawania pola wyboru pisowni do aplikacji WindowsForms. Ten przykład NIE wymaga instalacji programu Word, ani nie korzysta z niego w żaden sposób.
Używa WPF Interop przy użyciu elementu sterującego ElementHost do utworzenia WPF UserControl z WPF TextBox. WPF TextBox ma wbudowaną funkcję sprawdzania pisowni. Będziemy wykorzystywać tę wbudowaną funkcję zamiast polegać na programie zewnętrznym.
ElementHost WPF TextBox
Ten przykład został wzorowany na przykładzie znalezionym w Internecie. Nie mogę znaleźć linku lub chciałbym podziękować autorowi. Wziąłem próbkę, którą znalazłem i zmodyfikowałem, aby działała w mojej aplikacji.
- Dodaj następujące odniesienia:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase i WindowsFormsIntegration
Utwórz nową klasę i wklej ten 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
Odbuduj rozwiązanie.
Dodaj nowy formularz.
Wyszukaj w przyborniku nazwę swojej klasy. Ten przykład to „Sprawdzanie pisowni”. Powinien być wymieniony w obszarze „YourSoulutionName” Components.
Przeciągnij nową kontrolkę do swojego formularza
Ustaw dowolną z odwzorowanych właściwości w zdarzeniu ładowania formularzy
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
- Ostatnią rzeczą, którą musisz zrobić, to zmienić świadomość DPI swojej aplikacji. Wynika to z faktu, że korzystasz z aplikacji WinForms. Domyślnie wszystkie aplikacje WinForm są DPI UNAWARE. Po wykonaniu kontroli, która ma host elementu (WPF Interop), aplikacja stanie się teraz DPI AWARE. Może to powodować bałagan w elementach interfejsu użytkownika. Rozwiązaniem tego jest zmuszenie aplikacji do zmiany DPI UNAWARE. Można to zrobić na 2 sposoby. Pierwszy polega na przejściu pliku manifestu, a drugi na sztywnym wpisaniu go do programu. Jeśli używasz OneClick do wdrożenia aplikacji, musisz ją na stałe zakodować, nie używać pliku manifestu, inaczej błędy będą nieuniknione.
Oba poniższe przykłady można znaleźć pod następującym adresem: Skalowanie WinForm przy dużych ustawieniach DPI - czy to w ogóle możliwe? Dziękujemy Telerik.com za świetne wyjaśnienie DPI.
Kod na przykład DPI Aware. To MUSI zostać wykonane przed zainicjowaniem pierwszego formularza. Zawsze umieszczam to w pliku ApplicationEvents.vb. Możesz przejść do tego pliku, klikając prawym przyciskiem myszy nazwę projektu w eksploratorze rozwiązań i wybierając „Otwórz”. Następnie wybierz kartę aplikacji po lewej, a następnie kliknij „Wyświetl zdarzenia aplikacji” w prawym dolnym rogu obok rozwijanego ekranu powitalnego.
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
Przykład manifestu
<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>