When Stephen Elop announced Nokia was adopting Windows Phone 7 as its main development platform for the future, many of us felt a mix of fear for our jobs, incredulousness (are they committing suicide?), anger for betraying open source, then curiosity. What’s this WP7 about and what’s up in regards to development?
The canonical development platform for WP7 consists of Visual Studio 2010 and managed applications developed in .NET 4 using C# as the programming language and a WPF for the user interface. If you are not into .NET, you may be a bit lost now.
Visual Studio is Microsoft’s development environment, including IDE, compiler, debugger, profiler and much more. In my opinion, it is one of the finest applications Microsoft has developed. It is many years ahead of QtCreator, KDevelop, Eclipse or anything else.
.NET is a framework Microsoft started more than a decade ago. It includes libraries, a language independence infrastructure, memory management, localization and many more features. Applications can be compiled as native code (for x86 or x64), or as managed code (bytecode). .NET also includes a bytecode JIT compiler. You can target the .NET platform in many languages, including but not limited to, Visual Basic .NET, C#, F#, C++/CLI (it’s NOT the C++ you know!), etc
Interestingly, you can also compile normal C++ to .NET but it will have unmanaged code (i. e. code where memory allocations/deallocations are performed by you instead of the runtime, and pointers). WP7 requires that all code that runs on it be managed. This means that Qt cannot run on WP7, even though it may be compiled targetting the .NET platform and it would run on desktop operating systems.
C# is a multi-paradigm programming language developed by the father of Delphi. It is very powerful and looks a lot like C++2011. When I was learning C#, I couldn’t but think what the actual implementation of C# features were behind the scenes, in C and C++.
WPF is Windows Presentation Foundation (formerly known as Avalon), the technology (library) used for the GUI. In plain terms, it’s a library which provides accelerated everything for Windows applications: widgets, 2D, 3D, scalable graphics, etc
When developing UIs in WPF, you can either use C# code:
// Create a Button with a string as its content. Button stringContent = new Button(); stringContent.Content = "This is string content of a Button"; // Create a Button with a DateTime object as its content. Button objectContent = new Button(); DateTime dateTime1 = new DateTime(2004, 3, 4, 13, 6, 55); objectContent.Content = dateTime1; // Create a Button with a single UIElement as its content. Button uiElementContent = new Button(); Rectangle rect1 = new Rectangle(); rect1.Width = 40; rect1.Height = 40; rect1.Fill = Brushes.Blue; uiElementContent.Content = rect1; // Create a Button with a panel that contains multiple objects // as its content. Button panelContent = new Button(); StackPanel stackPanel1 = new StackPanel(); Ellipse ellipse1 = new Ellipse(); TextBlock textBlock1 = new TextBlock(); ellipse1.Width = 40; ellipse1.Height = 40; ellipse1.Fill = Brushes.Blue; textBlock1.TextAlignment = TextAlignment.Center; textBlock1.Text = "Button"; stackPanel1.Children.Add(ellipse1); stackPanel1.Children.Add(textBlock1); panelContent.Content = stackPanel1;
or use XAML, which is an XML-based language for WPF:
<!--Create a Button with a string as its content.--> <Button>This is string content of a Button</Button> <!--Create a Button with a DateTime object as its content.--> <Button xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:DateTime>2004/3/4 13:6:55</sys:DateTime> </Button> <!--Create a Button with a single UIElement as its content.--> <Button> <Rectangle Height="40" Width="40" Fill="Blue"/> </Button> <!--Create a Button with a panel that contains multiple objects as its content.--> <Button> <StackPanel> <Ellipse Height="40" Width="40" Fill="Blue"/> <TextBlock TextAlignment="Center">Button</TextBlock> </StackPanel> </Button>
More or less, WPF is to .NET what QML is to Qt.
Ouch. This WP7 is completely different to what we are used to. Maybe we can make them less different?
People tend to believe WPF and XAML are the same thing. They are not. XAML is one of the languages (which happens to be used by 99.99% of the people) to write applications in WPF but it is not the only one. You can write WPF applications in C# code (it’s not unusual to mix XAML and C#, what we call “code behind” in WPF parlance), or you could create your own XAML-equivalent language.
Or you could make my wish for today true: create a compatibility layer for QML to be able to develop WPF applications in QML, effectively replacing XAML. It is technically possible. This will also require a glue-layer for C#, similar to what we have now to bridge QML and C++. This would make porting applications from C++ and QML to C#, QML and WPF a relatively easy task, and may provide realistic path to convert Qt applications to WP7 withouth a full rewrite.
Update Fixed XAML vs C# code, thanks ‘aa’. Also, please note using C++ with QML WPF would be straightforward