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
Nguồn
2010-10-26 17:15:40
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
Đó 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ế. –
Erm, hãy nghĩ về nó, bạn phải có VS2008 nếu bạn sử dụng WPF? –