Visual Basic .NET Language
WinForms SpellCheckBox
Поиск…
Вступление
Пример добавления флажка проверки правописания в приложение WindowsForms. В этом примере не требуется устанавливать Word и не использовать Word каким-либо образом.
Он использует WPF Interop с помощью элемента управления ElementHost для создания пользовательского элемента управления WPF из текстового поля WPF. WPF TextBox имеет встроенную функцию проверки орфографии. Мы будем использовать эту встроенную функцию, а не полагаться на внешнюю программу.
ElementHost WPF TextBox
Этот пример был смоделирован после примера, который я нашел в Интернете. Я не могу найти ссылку, или я бы дал автору кредит. Я взял образец, который я нашел, и изменил его, чтобы работать для моего приложения.
- Добавьте следующие ссылки:
System.Xaml, PresentationCore, PresentationFramework, WindowsBase и WindowsFormsIntegration
Создайте новый класс и пропустите этот код.
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
Перестройте решение.
Добавьте новую форму.
Найдите панель инструментов для своего имени класса. Этот пример - «Проверка орфографии». Он должен быть указан в разделе «Компоненты YourSoulutionName».
Перетащите новый элемент управления в форму
Установите любое из отображаемых свойств в событии загрузки форм
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
- Последнее, что вам нужно сделать, это изменить понимание DPI вашего приложения. Это связано с тем, что вы используете приложение WinForms. По умолчанию все приложения WinForms являются DPI UNAWARE. После того, как вы выполните элемент управления с узлом элемента (WPF Interop), приложение теперь станет DPI AWARE. Это может или не может быть связано с вашими элементами интерфейса. Решение этого заключается в том, чтобы заставить приложение стать DPI UNAWARE. Есть два способа сделать это. Первый - через файл манифеста, а второй - это жесткий код для вашей программы. Если вы используете OneClick для развертывания своего приложения, вы должны его жестко закодировать, а не использовать файл манифеста или ошибки будут неизбежны.
Оба следующих примера можно найти в следующем: Масштабирование WinForms при больших настройках DPI - возможно ли это? Благодаря Telerik.com за отличное объяснение по DPI.
Пример кодированного кода DPI с жестким кодированием. Это ДОЛЖНО выполняться до инициализации первой формы. Я всегда помещаю это в файл ApplicationEvents.vb. Вы можете перейти к этому файлу, щелкнув правой кнопкой мыши по имени своего проекта в проводнике решений и выбрав «Открыть». Затем выберите вкладку приложения слева, а затем нажмите «Просмотреть события приложения» в правом нижнем углу рядом с раскрывающимся экраном.
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
Пример манифеста
<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>