Поиск…


Вступление

Пример добавления флажка проверки правописания в приложение WindowsForms. В этом примере не требуется устанавливать Word и не использовать Word каким-либо образом.

Он использует WPF Interop с помощью элемента управления ElementHost для создания пользовательского элемента управления WPF из текстового поля WPF. WPF TextBox имеет встроенную функцию проверки орфографии. Мы будем использовать эту встроенную функцию, а не полагаться на внешнюю программу.

ElementHost WPF TextBox

Этот пример был смоделирован после примера, который я нашел в Интернете. Я не могу найти ссылку, или я бы дал автору кредит. Я взял образец, который я нашел, и изменил его, чтобы работать для моего приложения.

  1. Добавьте следующие ссылки:

System.Xaml, PresentationCore, PresentationFramework, WindowsBase и WindowsFormsIntegration

  1. Создайте новый класс и пропустите этот код.

    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
    
  2. Перестройте решение.

  3. Добавьте новую форму.

  4. Найдите панель инструментов для своего имени класса. Этот пример - «Проверка орфографии». Он должен быть указан в разделе «Компоненты YourSoulutionName».

  5. Перетащите новый элемент управления в форму

  6. Установите любое из отображаемых свойств в событии загрузки форм

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
  1. Последнее, что вам нужно сделать, это изменить понимание 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>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow