C# und WPF: Binäruhr (de-DE)
In C# (und auch anderen Sprachen) ist es recht einfach eine eigene Binäruhr zu programmieren.
Als erstes braucht man hierzu einen (Dispatcher)Timer, es würde theoretisch reichen, wenn der Timer ein Interval von 1 Sekunde hat, aber dann würde die Uhr bei der Sekundenanzeige etwas von der Windows-Uhr abweichen, was unter Umständen stört. Darum empfehle ich ein Intervall von 200 Millisekunden.
Als nächstes wird eine Methode benötigt, mit der man eine Dezimalzahl in eine Binärzahl umrechnen kann. Am besten nehmen Sie folgende:
private string ToBin(int dec)
{
if (dec == 0)
return "0";
int dec2 = dec / 2;
return ToBin(dec2) + dec % 2;
}
Als nächstes benötigen Sie eine entsprechende "Anzeigetafel". In XAML können Sie einfach das Border- bzw. das Ellipse-Steuerelement benutzen.
Nun müssen Sie das Tick-Event des Timers abfangen und entsprechend, des return-Werts von ToBin die Einzelnen Ellipsen die Farbe ändern:
void timer_Tick(object sender, EventArgs e)
{
char[] s;
s = ToBin(DateTime.Now.Second).TrimStart('0').PadLeft(6, '0').ToCharArray();
for(int i = 0; i < s.Length; ++i)
{
if(s[i] == '1')
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_s_" + i)).Background = (Brush)Resources["Brush1"];
}
else
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_s_" + i)).Background = (Brush)Resources["Brush2"];
}
}
if(DateTime.Now.Second == 0 || firststart)
{
s = ToBin(DateTime.Now.Minute).TrimStart('0').PadLeft(6, '0').ToCharArray();
for (int i = 0; i < s.Length; ++i)
{
if (s[i] == '1')
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_m_" + i)).Background = (Brush)Resources["Brush1"];
}
else
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_m_" + i)).Background = (Brush)Resources["Brush2"];
}
}
if(DateTime.Now.Minute == 0 || firststart)
{
s = ToBin(DateTime.Now.Hour).TrimStart('0').PadLeft(5, '0').ToCharArray();
for (int i = 0; i < s.Length; ++i)
{
if (s[i] == '1')
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_h_" + i)).Background = (Brush)Resources["Brush1"];
}
else
{
((Border)LogicalTreeHelper.FindLogicalNode(gridContent, "border_h_" + i)).Background = (Brush)Resources["Brush2"];
}
}
firststart = false;
}
}
}
Der Code funktioniert nur, wenn Ihre Border folgendermaßen benannt wurden sind:
Stunden-Border: | border_h_0
border_h_1 border_h_2 border_h_3 border_h_4 |
Minuten-Border: | border_m_0
border_m_1 border_m_2 border_m_3 border_m_4 border_m_5 |
Sekunden-Border | border_s_0
border_s_1 border_s_2 border_s_3 border_s_4 border_s_5 |
Zu guter letzt fügen Sie noch einen Ereignis-Handler für das Loaded-Event hinzu und starten Sie in diesem den Timer.