Попытка использовать класс C # SpellCheck - PullRequest
19 голосов
/ 26 октября 2010

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

SpellCheck.SetIsEnabled(txtWhatever, true);

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

Спасибо

Ответы [ 6 ]

52 голосов
/ 26 октября 2010

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

Добавьте новый класс в свой проект и вставьте код, показанный ниже.Компиляция.Перетащите элемент управления SpellBox с верхней части панели инструментов на форму.Он поддерживает событие TextChanged и свойства Multiline и WordWrap.Существует проблема с шрифтом, нет простого способа сопоставить шрифт WF со свойствами шрифта WPF.Самый простой обходной путь для этого - установить для шрифта формы значение «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
0 голосов
/ 24 апреля 2016

Мне нужно было добавить цвет фона в текстовое поле в 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));
    }
}
0 голосов
/ 01 августа 2013

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

Полное раскрытие ... действительно написано вами

0 голосов
/ 10 июля 2012

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

0 голосов
/ 26 октября 2010

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

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

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

0 голосов
/ 26 октября 2010

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

txtWhatever.SpellCheck.IsEnabled = true;
...