WPF Rechtschreibprüfung in WinForm Applikationen.

Wer schon einmal die Anforderung hatte, Texte in einer TextBox oder RichTextBox in einer WinForm Applikation auf Rechtschreibung prüfen zu müssen, kennt u.U. folgendes Szenario:

  1. Word Instanz erstellen und unsichtbar machen
  2. Dokument erstellen
  3. Über die Zwischenablage den Text hineinkopieren
  4. Die Methode SpellCheck von Word aufrufen
  5. Den Text in Word markieren und in die Zwischenablage kopieren
  6. Den Text zurück in die TextBox einfügen und Word schließen

 

Neben der eher ungeliebten Word-Automation in einer .NET Applikation kommt die Instabilität hinzu, die man damit riskiert (z.B. hängengebliebene Word-Instanzen).

Wer davon gehört hat, dass TextBox Steuerelemente in WPF eine eingebaute Rechtschreibprüfung besitzen, die sogar “inline” funktioniert, wird sich sicher fragen, was ihm das bringt, wenn er doch eine WinForm Applikation entwickelt.

Dieser Artikel zeigt in aller Kürze (…), wie man sich diese Tatsache als WinForm Entwickler zu Nutze machen kann.

Anforderungen

Folgende Anforderungen soll die TextBox unterstützen:

  • Rechtschreibkorrektur
  • Zählen der eingegebenen Zeichen (Events)
  • Konfiguration der Schriftart aus der WinForm Applikation heraus (Databinding)

 

Projekt erstellen

File –> New Project –> Visual C#, Windows; Windows Forms Application; Name: WPFIntegrationDemo

Project –> Add New Item –> Visual C# Items, User Control (WPF); Name: ModernTextBox.xaml

Nun ziehen wir via Drag and Drop eine (WPF) TextBox aus der ToolBox in das (WPF) UserControl und machen wir folgende Einstellungen, um die TextBox das UserControl komplett ausfüllen zu lassen:

VerticalAlignment Stretch
HorizontalAlignment Stretch
Height Auto
Width Auto
Margin 0;0;0;0

Damit die ModernTextBox in unserem Projekt zur Verfügung steht, kompilieren wir das Projekt an dieser Stelle einmal.

Nun wird der Form1 im Designmode das Steuerelement ElementHost hinzugefügt (zu finden in der ToolBox unter WPF Interoperability(-ation*)). Dabei öffnet sich direkt das Smarttag und es kann das zu hostende WPF Steuerelement (ModernTextBox) ausgewählt werden.

WPF_Interoperability_01

Der Einfachheit halber kann hier das Control auch einfach im Winform angedockt werden. Das ist das gleiche, wie Dock: Fill.

Jetzt kann das Projekt bereits zum Testen gestartet werden und siehe da: Eine WPF basierte TextBox in einer WinForm Applikation.

 

Rechtschreibkorrektur

Dies ist der einfachste Teil, da WPF basierte TextBoxen von Haus aus eine Rechtschreibkorrektur ermöglichen.

In der ModernTextBox.xaml wird einfach das TextBox-Tag um das Attribut SpellCheck.IsEnabled erweitert:

<TextBox Name="textBox1" 
                 Height="Auto"
                 Width="Auto"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 Margin="0"
                 SpellCheck.IsEnabled="True" />

Das war es auch schon:

image

 

Zählen der eingegebenen Zeichen

In WinForm Applikationen ist eine einfache Möglichkeit, die eingegebenen Zeichen zu zählen, auf das KeyUp Event der TextBox zu reagieren.

Das ist mit einem eingebetteten WPF Steuerelement zum Glück nicht anders. Für die Anzeige wählen wir einfach einen StatusStrip Steuerelement und fügen zwei StatusLabel hinzu. Dem ersten geben wir den Text "Zeichen:”, bei dem zweiten löschen wir den Text und aktualisieren ihn mit der Anzahl der eingegebenen Zeichen als Reaktion auf das KeyUp Event der WPF TextBox:

public Form1()
{
InitializeComponent();
this.modernTextBox1.textBox1.KeyUp +=
new System.Windows.Input.KeyEventHandler(textBox1_KeyUp);
}

void textBox1_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
this.CharacterCountToolStripStatusLabel.Text =
this.modernTextBox1.textBox1.Text.Length.ToString();
}

 

Konfigurieren der Schriftart

Es gibt verschiedene Wege, um dafür zu sorgen, dass die Konfiguration der Schriftart der TextBox einfach von der WinForm Applikation gemacht werden kann. Ich zeige jetzt einen Weg, der auch etwas über die Databinding Fähigkeiten von WPF Steuerelementen zeigt und das sog. PropertyMapping des ElementHost Steuerelementes.

Zunächst einmal: Während wir in WinForm Applikationen mit System.Drawing.Font arbeiten, gibt es in WPF Applikationen u.a. System.Windows.Media.FontFamily. Aber auch FontSize, FontStretch, FontStyle und FontWeight. Die schlechte Nachricht: Die sind nicht direkt kompatibel. Die Gute: Das Steuerelement ElementHost verfügt über eine PropertyMap, die transparent für den Entwickler bestimmte Eigenschaften von WinForm auf WPF mappt.

Allerdings landen diese Einstellungen dann natürlich in dem WPF UserControl und erst einmal nicht in der darin angedockten TextBox.

Via DataBinding können nun die Eigenschaften der TextBox mit denen des UserControls verbunden werden (es gibt viele andere Wege… dieser dient der Demonstration):

image

Dazu klickt man auf das Kästchen direkt neben der Eigenschaft (Advanced Properties) und wählt Apply Data Binding. Als Quelle wählt man Relative Source –> Find Ancestor –> UserControl und als Pfad FontFamily (wie gesagt: Ein Beispiel).

Das wiederholt man für die anderen Eigenschaften. Damit wirken sich die Font Einstellungen des UserControls direkt auf die der TextBox aus.

Um das zu demonstrieren, fügen wir einen ToolStrip in das WinForm ein und konfigurieren einen Button, dessen OnClick Eventhandler folgenden Code implementiert:

private void toolStripButton1_Click(object sender, EventArgs e)
{
using (var fontDialog = new FontDialog())
    {
     if (fontDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
         this.elementHost1.Font = fontDialog.Font;
}
}
}

Und hier sehen wir das Ergebnis: Die Font Eigenschaft des ElementHosts stammt aus dem Namespace System.Drawing und wird intern für WPF automatisch in die entsprechenden FontFamily, FontWeight, etc. Eigenschaften gewandelt:

image

Wer es übrigens noch nicht weiß: Im Visual Studio 2010 Verzeichnis unter Common7/VS2010ImageLibrary findet sich eine .zip Datei, die eine große Menge an u.a. Icons beeinhaltet, die frei in eigenen Applikationen verwendet werden dürfen. Die einzige “Restriktrion” ist, dass die Bilder nur für ihren angedachten Zweck verwendet werden dürfen (z.B. darf man das Icon für die Funktion Ausschneiden nicht für die Funktion Einfügen verwenden).

Für den ToolStrip Button habe ich z.B. folgendes Icon genutzt:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1033\Actions\png_format\Office and VS\FontDialogHS.png

 

Zusammenfassung

Ich hoffe, dass dieser kleine Beitrag helfen konnte, aufzuzeigen, wie einfach es ist, zum einen WPF Steuerelemente in WinForm basierte Applikationen zu integrieren und zum anderen dort bekanntes Wissen anzuwenden, um mit ihnen zu interagieren. Natürlich gibt es viel Neuland zu betreten und einige Fallstricke zu umgehen. Aber der Einsatz kann sich lohnen. Vor allem, wenn er der erste Schritt in Richtung einer Migration nach WPF darstellt.

 

* Wer den verstanden hat und es als erster kommentiert, bekommt von mir einen Kasten Bionade zugeschickt.

Comments are closed

Über die Autoren

Christian Jacob ist Leiter des Geschäftsbereiches Softwarearchitektur und -entwicklung und zieht als Trainer im Kontext der .NET Entwicklung sowie ALM-Themen Projekte auf links.

Marcus Jacob fokussiert sich auf die Entwicklung von Office-Addins sowie Windows Phone Apps und gilt bei uns als der Bezwinger von Windows Installer Xml.

Martin Kratsch engagiert sich für das Thema Projektmanagement mit dem Team Foundation Server und bringt mit seinen Java- und iOS-Kenntnissen Farbe in unser ansonsten von .NET geprägtes Team.

Aktuelle Kommentare

Comment RSS