C#: Wenn man sich mal WPF anschaut…

Eigentlich woltle ich nur mal eben schnell einen Countdown basteln.
Mal eben schnell ein Label und einen Timer auf eine Form gezogen, Intervall einsgestellt, ne TimeSpan ausgerechnet und diese mit dem Timer im Label aktualisiert.
DAS kann man auch perfekt in einem Mini-WPF Progrämmle machen, so dachte ich – denkste… :-/

In Wahrheit sieht das alles doch etwas anders aus.

Es fängt schon damit an, dass es keinen Timer zum auf die Form ziehen in WPF gibt.
Forms gibt es übrigens auch nicht, eine Form heisst jetzt „Window1“ und erbt vom Typ „Window“.
Ein Label tut nicht mehr das was ein WinForm Label tat.
Das WPF-Label kann etwas mehr und hat z.b. Spezielle Eigenschaften für DataBinding.
Eine „Text“-Eigenschaft um den text zu ändern sucht man allerdings vergebens.
Dafür gibt es eine Eigenschaft mit dem Namen „Content“, welche ein Objekt (und damit auch einen String) entgegen nimmt, womit man dann den angezeigten Text des Labels ändern kann.
Die WPF-Alternative zum Label wäre nun der – und jetzt kommts – der „TextBlock“.
Dieses Dingel ähnelt dem Winform-Label wohl am ehesten. Auch die gewohnte „Text“-Eigenschaft ist vorhanden. Der Textblock kann wohl sehr viel weniger als ein Label und ist diesem auch Performace-Technisch vorzuziehen.

So.. jetzt aber mal ein Wenig Code wie ich das ganze gelöst habe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace MeinCountdown
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private System.Windows.Threading.DispatcherTimer Timer;
 
        public Window1()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Timer = new System.Windows.Threading.DispatcherTimer();
            Timer.Interval = TimeSpan.FromSeconds(1);
            Timer.Tick += new EventHandler(Timer_Tick);
            Timer.Start();
        }
 
        void Timer_Tick(object sender, EventArgs e)
        {
            DateTime jetzt = DateTime.Now;
            DateTime ende = DateTime.Parse("17.02.2011 12:00:00");
            TimeSpan span = ende-jetzt;
            txt_jetzt.Text = "Noch "+span.Days.ToString() + " Tage " +
                             span.Hours.ToString() + " Stunden " +
                             span.Minutes.ToString() + " Minuten " +
                             span.Seconds.ToString() + " Sekunden ";
        }
 
    }
}

Das war es auch schon 🙂
Damit wird jede Sekunde das Label (TextBlock) auf der Form (dem Window) aktualisiert 🙂

leave your comment


*

Unterstütze den Frickelblog!