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.

  1. Dodaj następujące odniesienia:

System.Xaml, PresentationCore, PresentationFramework, WindowsBase i WindowsFormsIntegration

  1. 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
    
  2. Odbuduj rozwiązanie.

  3. Dodaj nowy formularz.

  4. Wyszukaj w przyborniku nazwę swojej klasy. Ten przykład to „Sprawdzanie pisowni”. Powinien być wymieniony w obszarze „YourSoulutionName” Components.

  5. Przeciągnij nową kontrolkę do swojego formularza

  6. 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
  1. 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>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow