Freigeben über


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.