Попытка использования класса С# SpellCheck

Я пытаюсь использовать класс SpellCheck класса С# (в PresentationFramework.dll). Но у меня возникают проблемы при попытке привязки написания к моему текстовому полю:

SpellCheck.SetIsEnabled(txtWhatever, true);

Проблема в том, что мой txtWhatever имеет тип System.Windows.Forms и параметр, который эта функция ищет, это System.Windows.Controls, и простое преобразование не удалось. Я также попытался создать свой TextBox этого типа, но... не смог. Кто-нибудь знает, как использовать этот объект проверки орфографии? (MSDN не помогло...)

Спасибо

Ответы

Ответ 1

Для выполнения проверки орфографии вам необходимо использовать текстовый блок WPF. Вы можете встроить его в форму Windows Forms с помощью элемента управления ElementHost. Он очень похож на UserControl. Вот элемент управления, который вы можете удалить прямо из панели инструментов. Чтобы начать работу, вам нужна Project + Add Reference и выберите WindowsFormsIntegration, System.Design и сборки WPF PresentationCore, PresentationFramework и WindowsBase.

Добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Переместите элемент управления SpellBox из верхней части панели инструментов в форму. Он поддерживает события TextChanged и свойства Multiline и WordWrap. Там проблема с nagging с Font, нет простого способа сопоставить шрифт WF с свойствами шрифта WPF. Простейшим обходным путем для этого является установка формы Font в "Segoe UI", по умолчанию для WPF.

using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
using System.Windows.Forms.Design;

[Designer(typeof(ControlDesigner))]
//[DesignerSerializer("System.Windows.Forms.Design.ControlCodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.Serialization.CodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
class SpellBox : ElementHost {
    public SpellBox() {
        box = new TextBox();
        base.Child = box;
        box.TextChanged += (s, e) => OnTextChanged(EventArgs.Empty);
        box.SpellCheck.IsEnabled = true;
        box.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
        this.Size = new System.Drawing.Size(100, 20);
    }
    public override string Text {
        get { return box.Text; }
        set { box.Text = value; }
    }
    [DefaultValue(false)]
    public bool Multiline {
        get { return box.AcceptsReturn; }
        set { box.AcceptsReturn = value; }
    }
    [DefaultValue(false)]
    public bool WordWrap {
        get { return box.TextWrapping != TextWrapping.NoWrap; }
        set { box.TextWrapping = value ? TextWrapping.Wrap : TextWrapping.NoWrap; }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public new System.Windows.UIElement Child {
        get { return base.Child; }
        set { /* Do nothing to solve a problem with the serializer !! */ }
    }
    private TextBox box;
}

По популярности, версия VB.NET этого кода, которая позволяет избежать лямбда:

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 SpellBox
    Inherits ElementHost

    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

    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(False)> _
    Public Property MultiLine() As Boolean
        Get
            Return box.AcceptsReturn
        End Get
        Set(ByVal value As Boolean)
            box.AcceptsReturn = value
        End Set
    End Property

    <DefaultValue(False)> _
    Public Property WordWrap() As Boolean
        Get
            Return box.TextWrapping <> TextWrapping.NoWrap
        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
    Private box As TextBox
End Class

Ответ 2

Попробовали ли вы просто установить свойство в фактическом TextBox, которое вы пытаетесь выполнить проверку орфографии. например

txtWhatever.SpellCheck.IsEnabled = true;

Ответ 3

Вы пытаетесь использовать компонент проверки правописания, предназначенный для WPF в приложении WinForms. Они несовместимы.

Если вы хотите использовать установленную .NET проверку орфографии, вам придется использовать WPF в качестве системы виджетов.

Если вы хотите использовать WinForms, вам понадобится сторонний компонент проверки правописания.

Ответ 4

Бесплатный инструмент проверки орфографии .NET, основанный на текстовом поле WPF, который можно использовать на стороне клиента или сервера, можно увидеть здесь. Он будет обертывать текстовое поле для вас, хотя вам все равно нужна сборка, включая рамки презентации и т.д.

Полное раскрытие... написанное по-настоящему

Ответ 5

Мне нужно было добавить цвет фона в текстовое поле в winforms, отражающее цвет, выбранный в дизайнере:

public override System.Drawing.Color BackColor
{
    get
    {
        if (box == null) { return Color.White; }
        System.Windows.Media.Brush br = box.Background;
        byte a = ((System.Windows.Media.SolidColorBrush)(br)).Color.A;
        byte g = ((System.Windows.Media.SolidColorBrush)(br)).Color.G;
        byte r = ((System.Windows.Media.SolidColorBrush)(br)).Color.R;
        byte b = ((System.Windows.Media.SolidColorBrush)(br)).Color.B;
        return System.Drawing.Color.FromArgb((int)a, (int)r, (int)g, (int)b);
    }
    set 
    {
        box.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(value.A, value.R, value.G, value.B));
    }
}

Ответ 6

как получить список слов на английском языке и скопировать его в текстовый файл. добавьте ссылку. затем используйте класс streamreader для анализа списка с помощью textbox.text. любые слова, не найденные в текстовом файле, могут быть выделены или отображены в диалоговом окне с параметрами для замены или игнорирования. это предложение дробовика со многими пропущенными шагами, и я 2 месяца в программировании, но... его то, что я собираюсь сделать в любом случае. Я делаю проект блокнота (rexpad на idreamincode.com). надеюсь, это помогло!