サーチ…


前書き

WindowsFormsアプリケーションにスペルチェックボックスを追加する方法の例。この例では、Wordをインストールする必要はありませんし、Wordを使用することもありません。

ElementHostコントロールを使用してWPF Interopを使用して、WPF TextBoxからWPF UserControlを作成します。 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. ツールボックスでクラス名を検索します。この例は "SpellCheck"です。 「YourSoulutionName」コンポーネントの下に表示されます。

  5. 新しいコントロールをフォームにドラッグします

  6. formsロードイベントにマップされたプロパティのいずれかを設定します。

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になります。これはあなたのUI要素を混乱させるかもしれません。これに対する解決策は、アプリケーションをDPI UNAWAREにすることです。これを行うには2つの方法があります。最初はマニフェストファイルを使用し、2番目はマニフェストファイルにハードコードします。 OneClickを使用してアプリケーションをデプロイする場合は、アプリケーションをハードコードする必要があります。マニフェストファイルを使用しないと、エラーが発生します。

以下の両方の例は、次のとおりです。WinForms大規模DPI設定でのスケーリング - それは可能ですか? Telerik.comのおかげで、DPIについての素晴らしい説明があります。

ハードコーディングされたDPI認識コードの例これは最初のフォームが初期化される前に実行されなくてはなりません(MUST)。私は常にこれを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