This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: WPF: Data Template zur Laufzeit ändern
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Wer WPF-Anwendungen entwickelt, kommt sehr schnell zur Problematik, dass dich Data Templates zur Laufzeit ändern sollen. Dies kann passieren, da bei einem MouseOver zusätzliche Informationen angezeigt werden sollen, oder es soll auf eine andere Aktion eine Reaktion gezeigt werden. Die Realisierung ist recht einfach, aber häufig gefragt.
Nehmen wir also ein kleines Beispiel. Gegeben sei ein Button, der eine Beschriftung anzeigt, die durch ein standardmäßig gesetztes Data Template erweitert wird. Beim MouseOver (also quasi als Hover-Effekt), sollt dieses Data Template ersetzt werden und vor der eigentlichen Beschriftung des Buttons einen anderen Text anzeigen, welcher beim Verlassen wieder zurückgesetzt wird.
Dafür erstellen wir ein Fenster, welches die jeweiligen Data Templates enthält, sowie die Darstellung des Buttons. Hier das Innenleben des Fensters als XAML:
Damit wären nun die beiden Data Templates definiert und der anzuzeigende Button. Das Template namens DefaultTemplate ist dem Button standardmäßig zugewiesen und setzt der eigentlichen Beschriftung des Buttons ein Default: voraus. Das Template, auf welches bei einem Hover gewechselt werden soll, setzt der eigentlichen Besschriftung ein Special: voraus.
In der Codebehind-Datei werden nun die notwendigen Events abonniert:
MouseOver
MouseLeft
Befindet sich die Maus über dem Button, soll das spezielle Template angewendet werden. Beim Verlassen der Maus, muss das ursprüngliche Template (also das DefaultTemplate) wieder hergestellt werden. Sehen wir uns dazu den C#-Code an:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.TestButton.MouseMove +=
new MouseEventHandler(TestButton_MouseMove);
this.TestButton.MouseLeave +=
new MouseEventHandler(TestButton_MouseLeave);
}
private void TestButton_MouseMove(
object sender,
MouseEventArgs e)
{
TestButton.ContentTemplate =
this.FindResource("SpecialTemplate") as DataTemplate;
}
private void TestButton_MouseLeave(
object sender,
MouseEventArgs e)
{
TestButton.ContentTemplate =
this.FindResource("DefaultTemplate") as DataTemplate;
}
}
Im Konstruktor des Fensters werden die beiden benötigten Events abonniert. In den jeweiligen Events wird nichts anderes gemacht, als in den Ressourcen nach dem gewünschten DatenTemplate zu suchen und es der Eigenschaft ContentTemplate des Buttons zuzuweisen. Idealerweise sollte noch eine Sicherheitsabfrage bezüglich der Existenz der Ressource untergebracht werden.
Damit ist es nun möglich, zur Laufzeit das Data Template eines Elements zu wechseln.