Ricerca…


introduzione

Esempio su come aggiungere una casella di controllo ortografico a un'applicazione WindowsForms. Questo esempio NON richiede l'installazione di Word né utilizza Word in alcun modo.

Usa Interoperabilità WPF usando il controllo ElementHost per creare un UserControl WPF da un TextBox WPF. WPF TextBox ha una funzione integrata per il controllo ortografico. Utilizzeremo questa funzione incorporata piuttosto che fare affidamento su un programma esterno.

ElementHost WPF TextBox

Questo esempio è stato modellato su un esempio che ho trovato su internet. Non riesco a trovare il link o darei credito all'autore. Ho preso il campione che ho trovato e modificato per funzionare per la mia applicazione.

  1. Aggiungi i seguenti riferimenti:

System.Xaml, PresentationCore, PresentationFramework, WindowsBase e WindowsFormsIntegration

  1. Crea una nuova classe e oltre questo codice

    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. Ricostruisci la soluzione.

  3. Aggiungi un nuovo modulo.

  4. Cerca nella casella degli strumenti il ​​nome della tua classe. Questo esempio è "SpellCheck". Dovrebbe essere elencato sotto Componenti 'YourSoulutionName'.

  5. Trascina il nuovo controllo nel modulo

  6. Impostare una qualsiasi delle proprietà mappate nell'evento di caricamento dei moduli

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. L'ultima cosa che devi fare è cambiare la consapevolezza DPI della tua applicazione. Questo perché stai usando l'applicazione WinForms. Di default tutte le applicazioni WinForms sono DPI UNAWARE. Una volta eseguito un controllo con un host di elementi (WPF Interop), l'applicazione diventerà DPI AWARE. Questo può o non può incasinare con i tuoi Elementi dell'interfaccia utente. La soluzione a questo è forzare l'applicazione a diventare DPI UNAWARE. Ci sono 2 modi per farlo. Il primo è attraverso il file manifest e il secondo è quello di inserire il codice nel tuo programma. Se si utilizza OneClick per distribuire l'applicazione, è necessario codificarlo, non utilizzare il file manifest o gli errori saranno inevitabili.

Entrambi i seguenti esempi possono essere trovati al seguente: WinForms Scaling a grandi impostazioni DPI - È anche possibile? Grazie a Telerik.com per l'ottima spiegazione su DPI.

Esempio di codice DPI a codice hard codificato. Questo DEVE essere eseguito prima che il primo modulo sia inizializzato. Lo posto sempre nel file ApplicationEvents.vb. È possibile accedere a questo file facendo clic con il pulsante destro del mouse sul nome del progetto in Solution Explorer e scegliendo "Apri". Quindi selezionare la scheda dell'applicazione a sinistra e quindi fare clic su "Visualizza eventi applicazione" in basso a destra accanto al menu a discesa della schermata iniziale.

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

Esempio manifesto

<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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow