2010-10-26 13 views
15

Próbuję użyć klasy C# dostarczanej przez funkcję sprawdzania pisowni (w PresentationFramework.dll). Ale mam problemy podczas próby związania pisownię mojego tekstowego:Próba użycia klasy sprawdzania pisowni C#

SpellCheck.SetIsEnabled(txtWhatever, true); 

Problemem jest to, że moja txtWhatever jest typu System.Windows.Forms i parametr tej funkcji szukasz System.Windows . Sterowanie i prosta konwersja nie powiodły się. Próbowałem również utworzyć mój TextBox tego typu, ale ... nie mogłem. Czy ktoś wie, jak korzystać z tego obiektu sprawdzania pisowni? (MSDN nie było to pomocne ...)

Dzięki

Odpowiedz

42

Musisz użyć pola tekstowego WPF, aby sprawdzać pisownię. Możesz osadzić go w formularzu Windows Forms za pomocą kontrolki ElementHost. Działa bardzo podobnie do UserControl. Oto kontrola, którą możesz upuścić bezpośrednio z przybornika. Aby rozpocząć, potrzebujesz Project + Add Reference i wybierz WindowsFormsIntegration, System.Design i zestawy WPF PresentationCore, PresentationFramework i WindowsBase.

Dodaj nową klasę do swojego projektu i wklej poniższy kod. Skompilować. Rzuć kontrolkę SpellBox z góry przybornika na formularz. Obsługuje zdarzenie TextChanged oraz właściwości Multiline i WordWrap. Istnieje problem z czcionką, nie ma łatwego sposobu zamodelowania czcionki WF na właściwości czcionki WPF. Najłatwiejszym rozwiązaniem jest ustawienie Czcionki formularza na "Segoe UI", domyślny dla 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; 
} 

Przez popularne popytu, wersja VB.NET tego kodu, który unika 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

Próbuję zaimplementować twoje rozwiązanie: Co to jest (s, e) część kodu? Ponieważ dostaję za to błąd kompilatora? – Assaf

+0

Jest to wyrażenie lambda, wymagane przez VS2008. Po prostu go usuń i pozwól intellisense dodać zamiast tego zwykłą metodę. –

+0

Erm, pomyśl o tym, musisz mieć VS2008, jeśli używasz WPF? –

0

Czy próbowałeś tylko ustawienie właściwości na rzeczywistej TextBox swoje próbującego sprawdzić pisownię. na przykład

txtWhatever.SpellCheck.IsEnabled = true; 
+0

Tak, próbowałem. System.Windows.Forms prawdopodobnie nie ma tej właściwości. To jest dokładnie mój problem ... – Assaf

+0

W każdym razie, dzięki za próbę – Assaf

0

Próbujesz użyć komponentu sprawdzania pisowni przeznaczonego dla WPF w aplikacji WinForm. Są niezgodne.

Jeśli chcesz użyć sprawdzania pisowni .NET, musisz użyć WPF jako systemu widgetów.

Jeśli chcesz trzymać się WinForm, potrzebujesz modułu sprawdzania pisowni innej firmy.

-1

co o uzyskanie listy słów w języku angielskim i kopiowania, że ​​do pliku tekstowego. dodaj referencję. następnie użyj klasy streamreader, aby przeanalizować listę przed textbox.text. Wszelkie słowa, które nie zostały znalezione w pliku tekstowym, można ustawić tak, aby były podświetlone lub wyświetlane w oknie dialogowym z opcjami do zastąpienia lub zignorowania. jest to sugestia shotguna z wieloma brakującymi krokami i mam 2 miesiące na programowanie, ale .... to, co i tak zamierzam spróbować. robię projekt notatnika (rexpad na idreamincode.com). mam nadzieję, że pomogło!

+0

To jest bardziej komentarz niż odpowiedź. Czy przeczytałeś zaakceptowaną odpowiedź? –

0

Darmowe narzędzie sprawdzania pisowni .NET oparte na polu tekstowym WPF, które może być używane po stronie klienta lub serwera, można zobaczyć pod numerem here. Owiń pole tekstowe, mimo że nadal potrzebujesz, aby zespół obejmował strukturę prezentacji itp.

Pełne ujawnienie ...napisany przez Ciebie naprawdę

0

Musiałem dodać kolor tła do pola tekstowego w WinForms że odzwierciedlenie koloru wybranego w autora:

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)); 
    } 
} 
Powiązane problemy