2010-10-26 35 views
15

Tôi đang cố gắng sử dụng lớp SpellCheck C# cung cấp (trong PresentationFramework.dll). Nhưng, tôi đang gặp vấn đề khi cố gắng để ràng buộc chính tả cho textbox của tôi:Cố gắng sử dụng lớp C# SpellCheck

SpellCheck.SetIsEnabled(txtWhatever, true); 

Vấn đề là txtWhatever của tôi là loại System.Windows.Forms và tham số chức năng này đang tìm kiếm là System.Windows .Control và chuyển đổi đơn giản không thành công. Tôi cũng đã cố gắng làm cho TextBox của tôi thuộc loại này, nhưng ... không thể. Có ai biết cách sử dụng đối tượng SpellCheck này không? (MSDN là không phải là hữu ích ...)

Cảm ơn

Trả lời

42

Bạn phải sử dụng Hộp văn bản WPF để thực hiện công việc kiểm tra chính tả. Bạn có thể nhúng một tệp trong biểu mẫu Windows Forms bằng điều khiển ElementHost. Nó hoạt động khá giống với một UserControl. Đây là một điều khiển mà bạn có thể thả thẳng từ hộp công cụ. Để bắt đầu, bạn cần Project + Add Reference và chọn WindowsFormsIntegration, System.Design và WPF assembly PresentationCore, PresentationFramework và WindowsBase.

Thêm lớp mới vào dự án của bạn và dán mã được hiển thị bên dưới. Biên dịch. Thả điều khiển SpellBox từ đầu hộp công cụ lên một biểu mẫu. Nó hỗ trợ sự kiện TextChanged và các thuộc tính Multiline và WordWrap. Có một vấn đề dai dẳng với Font, không có cách nào dễ dàng để ánh xạ một phông chữ WF tới các thuộc tính phông chữ WPF. Cách giải quyết đơn giản nhất cho việc đó là đặt Phông chữ của biểu mẫu thành "Giao diện người dùng Segoe", mặc định cho 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; 
} 

Nhu cầu phổ biến, một phiên bản VB.NET mã này mà tránh được lambda:

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

Tôi đang cố gắng thực hiện giải pháp của bạn: (s, e) một phần của mã có nghĩa là gì? Bởi vì tôi nhận được một lỗi biên dịch cho nó? – Assaf

+0

Đó là một biểu thức lambda, yêu cầu VS2008. Chỉ cần xóa nó và để cho intellisense thêm một phương thức thông thường thay thế. –

+0

Erm, hãy nghĩ về nó, bạn phải có VS2008 nếu bạn sử dụng WPF? –

0

Bạn đã cố gắng chỉ là thiết lập tài sản trên TextBox thực tế nỗ lực của bạn để kiểm tra chính tả. ví dụ.

txtWhatever.SpellCheck.IsEnabled = true; 
+0

Vâng, tôi đã cố gắng. System.Windows.Forms không có thuộc tính này. Đây chính xác là vấn đề của tôi ... – Assaf

+0

Dù sao, cảm ơn vì đã thử – Assaf

0

Bạn đang cố sử dụng thành phần kiểm tra chính tả được thiết kế cho WPF trên ứng dụng WinForms. Chúng không tương thích.

Nếu bạn muốn sử dụng kiểm tra chính tả do .NET cung cấp, bạn sẽ phải sử dụng WPF làm hệ thống tiện ích của mình.

Nếu bạn muốn gắn bó với WinForms, bạn sẽ cần một thành phần kiểm tra chính tả của bên thứ ba.

-1

gì về nhận được một danh sách các từ trong ngôn ngữ tiếng Anh và sao chép rằng vào một tập tin văn bản. thêm tham chiếu. sau đó sử dụng lớp streamreader để phân tích danh sách đối với textbox.text. bất kỳ từ nào không tìm thấy trong tập tin văn bản có thể được thiết lập để được đánh dấu hoặc hiển thị trong một hộp thoại với các tùy chọn để thay thế hoặc bỏ qua. đây là một đề nghị shotgun với nhiều bước mất tích và tôi là 2 tháng vào lập trình nhưng .... những gì im sẽ cố gắng anyway. tôi đang làm một dự án notepad (rexpad trên idreamincode.com). hy vọng điều này đã giúp!

+0

Đây là một bình luận nhiều hơn là một câu trả lời. Bạn đã đọc câu trả lời được chấp nhận chưa? –

0

Trình kiểm tra chính tả .NET miễn phí dựa trên hộp văn bản WPF có thể được sử dụng phía máy khách hoặc máy chủ có thể được xem here. Nó sẽ bọc hộp văn bản cho bạn mặc dù bạn vẫn cần lắp ráp bao gồm Khung trình bày, v.v.

Công bố đầy đủ ...được viết bởi bạn thực sự

0

tôi cần thêm một màu nền hộp văn bản trong winforms rằng phản ánh màu sắc được lựa chọn trong các nhà thiết kế:

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)); 
    } 
} 
Các vấn đề liên quan