2009-07-14 13 views
1

Ich habe eine Anwendung, die Textboxen an verschiedenen Stellen deklariert, wie in Stilen und Datatemplates, und jetzt bin ich in einer Situation, in der ich das Standardverhalten jedes Textfelds ändern muss, um den Fokus zu bekommen und zu verlieren.Ändern des Standardverhaltens einer TextBox?

Was ist ein guter Weg, dies zu tun?

Ich dachte an zwei Lösungen: Eine ist es, eine neue Klasse von TextBox abzuleiten, die, wie ich verstehe, allgemein verpönt ist. Das andere ist, eine Art von Stil zu erstellen, der EventSetters verwendet, aber da die Styles und Datamplates in meiner Anwendung keine CodeBehind-Dateien haben, weiß ich nicht, wie ein Event den passenden Event-Handler findet.

+1

Aus Neugier: warum ist die sich aus TextBox allgemein verpönt? – Tim

+1

@Tim: Ich habe mich das gleiche gefragt. – Treb

+0

Mein Eindruck war, dass eine Menge, wenn nicht sogar die meiste Funktionalität, die man durch Ableiten einer neuen Klasse erreichen würde, tatsächlich durch Ereignisse erreicht werden kann. – djcouchycouch

Antwort

2

Sie können einen Stil erstellen, die mit der Key-Eigenschaft für alle Textfelder gilt wie folgt:

<Style x:Key={x:Type TextBox}> 
... 
</Style> 

Sie können dann die Template-Eigenschaft des TextBox ändern und verwenden Trigger spezielle Verhalten der OnGotFocus und OnLostFocus hinzufügen Veranstaltungen.

+0

Funktioniert für mich. Auf diese Weise kann ich einfach einen Stil deklarieren und jeden Textkasten beeinflussen, ohne andere meine anderen Ressourcen ändern zu müssen. – djcouchycouch

0

Unter normalen Umständen würde ich auch Stirnrunzeln auf Unterklasse TextBox. In diesem Fall ist eine Unterklasse die beste Option, da Sie das Verhalten der TextBox ändern.

+2

Können Sie erklären, warum Unterklasse TextBox (oder ein anderes Steuerelement) möglicherweise eine schlechte Idee ist? – Treb

2

Basierend auf Ihrem Feedback, würde ich ein angeschlossenes Verhalten verwendet empfehlen wie folge:

<TextBox b:TextBox.SuppressOnFocus="True"/> 

Die beigefügte Verhalten Implementierung einfach zu GotFocus und Lostfocus und klar würde Attach/erneut anwenden, die gegebenenfalls verbindlich.

+0

Meine Textfelder sind mit Daten verknüpft, die ständig aktualisiert werden. Wenn ein Textfeld im Fokus ist, wird der Text des Textfelds auf den Wert der Eigenschaft festgelegt, selbst wenn der Benutzer versucht, etwas einzugeben. Mit den Ereignissen GotFocus und LostFocus wird die Datenbindung während der Eingabe des Benutzers vorübergehend aktiviert und deaktiviert. – djcouchycouch

+0

Ein angehängtes Verhalten klingt besser für Ihre Bedürfnisse. Aktualisiere meinen Beitrag ... –

0

Wenn Sie diese Funktionalität nur in einem Projekt verwenden möchten, können Sie UserControls mit einer TextBox erstellen und auf die OnFocus-Eigenschaften zugreifen. Sie können auch ein benutzerdefiniertes WPF-Steuerelement erstellen, das von einer TextBox abgeleitet wird und anschließend das LocusFocus-Ereignis implementiert.

Ich habe den gleichen Ansatz verwendet, um einen Benutzer Control TextBox zu schaffen, die Überprüfung durchführt:

http://www.highoncoding.com/Articles/578_Creating_WPF_TextBox_UserControl_to_Perform_Custom_Validation.aspx

Verwandte Themen