Introduction

This article presents a digital clock written using C# .Net 3.5 and Windows Presentation Foundation (WPF), with a version supporting styling using the RibbonStyleHandler from the Ribbon Control Library (and hence allowing styling consistent with RibbonWindow applications).

Using the Code

This is VERY simple, to create a new clock window, make a new instance of DigitalClockWindow! To add a control to an existing window, use DigitalClockControl.

About the Code

The DigitalClock class is comprised of DigitalClockDots and DigitalClockElement. The DigitalClockDots class is a UIElement representing two dots to separate hours from minutes from seconds. DigitalClockElement represents the following states: 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9. Hence the DigitalClock is a Grid of DigitalClockElement DigitalClockElement DigitalClockDots DigitalClockElement DigitalClockElement DigitalClockDots DigitalClockElement DigitalClockElement.

The DigitalClockControl and DigitalClockWindow classes contain a thread for updating the clock when AutoUpdate is set to true, otherwise the clock may be updated via the .CurrentTime property of DigitalClockControl.

DigitalClockControl contains three properties for styling, DigitBrush the Brush used to render the digits (0 to 9), DotBrush the Brush used to render the separating dots, and ClockBackground the background of the clock. DigitalClockDots contains a single property RenderBrush for setting the brush used to render the dots. DigitalClockElement contains a similar property RenderBrush for setting the brush used to render the graphic components. Furthermore it also contains a Value property for setting the value to display (in the range 0 to 9).

Ribbon Styled Clock

In version 1.0.0.1 RibbonClockControl and RibbonClockWindow have been added which inherit from DigitalClockControl and DigitalControlWindow respectively; they add automatic styling based on the RibbonStyleChanged event, and can be seen in use in the CIRIP project (a Computational Intelligent Railway Intervention Planner).

Share

About the Author

I originally studied for a masters in engineering of software engineering at The University of Birmingham during 2000-2004, of which I received a 2:1. I continued at Birmingham University working with Civil Engineering and Rail Research UK where I am currently in my final year of a 3 year PhD project developing a Computational Intelligent Approach to Railway Intervention Planning. Although my work has a significant focus on railway engineering and associated practices much of my work is with data mining (on SQL Server 2008) and computational intelligence (CI) techniques. My key areas of expertise in CI are clustering algorithms (including Rival Penalised Competitive Learning) and evolutionary algorithms.

Outside of my formal work I enjoy testing the latest technologies such as .NET 3.5 and the many frameworks of which it comprises (mainly WPF). I have several projects on the go including a .NET and DirectX port of Quake 3 and many utility libraries. I also maintain an extensive website coded in Cold Fusion which is regularly updated; more information is available about me there.

Comments and Discussions

You may want to double check the license selection in your article publication options. You selected the CPOL license for this article (as seen at the top right of the article). However, the zip includes what appears to be a CPOL license with the only modification being that it does not allow commercial use. The two are contrary to one another. By publishing with two licenses in this way you may give readers the option of selecting which license they choose to be goverened by, thereby negating what appears to be your desired restriction on commercial use.

However as a rule you should ALWAYS select the more restrictive of the licenses to assume to be correct. Errors and typos exist and you may get the wrong side of copyright if you pick the less restrictive one.

TO CONFIRM --- NO COMMERCIAL USAGE INCLUDING NOT-FOR-PROFIT / CHARITY WITHOUT PRIOR AUTHORISATION FROM MYSELF.

When I type Alt-F4 to close the clock, the thread isn't terminated, so it remains in the process list. This also prevents further recompilation of the code until the process is terminated. I'm surprised you didn't discover that yourself.

How do I change the skin? Your article shows three skins, but the program only shows the first one.

How do I modify the window so it's sizable? I tried a few things but the code would subsequently crash.

When I type Alt-F4 to close the clock, the thread isn't terminated, so it remains in the process list

Marc Clifton wrote:

I'm surprised you didn't discover that yourself.

In the context i'm using it's not a problem as the thread gets registered elsewhere and gets closed there. A slight oversight which I will correct when I get a moment.

Marc Clifton wrote:

How do I change the skin? Your article shows three skins, but the program only shows the first one.

Take a look at the Ribbon Control library in the referances section. The styling of the control is done by RibbonStyleHandler. Calling RibbonStyleHander.restyle(RibbonStyle.Blue|Green|Gray|Black) will give you some options. Also take a look at RibbonStyleConfigWindow which is currently being developed and finalised. In the next version i'm restructing the code significantlly better which will give better access to manual styling.

Marc Clifton wrote:

How do I modify the window so it's sizable? I tried a few things but the code would subsequently crash.

It's not implemented yet is the simple answer. Off the top of my head though I know you can perform some render transforms, so that would perhaps be the quick fix until I make to control more sizable (which I will endevour to add in the next release also).