One year ago I wrote a post on Which .NET framework for Windows: UWP, WPF or Windows Forms? which is still the most popular post on this site, indicating perhaps that this is a tricky issue for many developers. That this is a live question is a symptom of Microsoft’s many changes of strategic direction over the last decade, making it hard for even the most loyal developers to read the signals.
I was intrigued therefore to note that Microsoft has an official Choose your platform post on this subject. There is something curious about this post. It covers three frameworks: Universal Windows Platform (UWP), Windows Presentation Foundation (WPF) and Windows Forms (WinForms). Microsoft states:
UWP is our newest, leading-edge application platform.
implying that if you have an unconstrained choice, this is the way to go. Yet if you look at the table of “Scenarios that have limited support”, UWP has the longest list. It is not only Windows 7 support that you will miss, but also something called Dense UI, along with other rather significant features like multiple windows and “full platform support”.
What is Dense UI? I presume this is a reference to the chunkiness of a typical UWP UI, caused by the fact that it was originally optimised for touch control. This matters if, for example, you are writing a business application and want to have a lot of information to hand in a single window. It may not be ideal for cosmetics, but it can be good for productivity.
With respect to all three of these limitations, Microsoft does note that “We have publicly announced features that will address this scenario in a future release of Windows 10.” I am not sure that they are in fact fully addressed; but it is clear that improvements are coming. In fact, the promise of further active development is perhaps the key reason why you might choose UWP for a new project, that is, if you do not learn from the past and believe that UWP will still be core to Microsoft’s strategy in say five years time.
Take a look at the strengths column for UWP though. Anything really compelling there? To my mind, just one. “Secure execution via application containers.” Yet the security of UWP was undermined by Microsoft’s decision to abandon its original goal of restricting the Windows Runtime API (used for UWP) to a safe subset of the full Windows API. You can also now wrap WPF and WinForm applications using Desktop Bridge, getting Store delivery and a certain amount of isolation.
At the time of writing, Microsoft is still displaying this diagram in its guide to UWP.
This is now somewhat misleading though. Windows Mobile is on death row:
Windows 10 Mobile, version 1709 (released October 2017) is the last release of Windows 10 Mobile and Microsoft will end support on December 10, 2019. The end of support date applies to all Windows 10 Mobile products, including Windows 10 Mobile and Windows 10 Mobile Enterprise.
Windows 10 Mobile users will no longer be eligible to receive new security updates, non-security hotfixes, free assisted support options or online technical content updates from Microsoft for free.
As a developer then, would you rather have PC, Xbox and HoloLens support? Or PC, Mac, iOS and Android support? If the latter, you would be better off investigating Microsoft’s Xamarin Forms framework than UWP as such.
The truth is, many developers who target Windows desktop applications do so because they want to run well on Windows and are not concerned about cross-platform. While that may seem odd from a consumer perspective, it is not so odd for corporate development with deskbound users performing specific business operations.
I was at one time enthusiastic about Windows Runtime/UWP because I liked the idea of “one Windows platform” as illustrated above, and I liked the idea of making Windows a platform for secure applications. Both these concepts have been thoroughly undermined, and I would suggest that the average developer is probably better off with WPF or WinForms (or other approaches to Win32 applications such as Delphi etc), than with UWP. Or with Xamarin for a cross-platform solution. That is unfortunate because it implies that the application platform Microsoft is investing in most is at odds with what developers need.
If UWP becomes a better platform than WPF or WinForms in all important respects, that advice will change; but right now it is not all that compelling.
Agreed, we need a realistic vision like yours and not a fan boy vision. Thanks for that.
I believe Microsoft actually knows UWP isn’t good for the most LOB and to not lose all investment done now we have this “XAML Island” feature… so we can incorporate UWP elements in our WPF, Winform or even C++/Delphi applications. I’ve heard it still doesn’t work as expected, would know anything about it?
I think it’s even worse.
I develop an open source software. My main users are on Windows, and even though it’s a small contribution, my application (like those of million others) make Windows the best platform for power users, content creators, and business users.
I use Qt/C++ as a GUI framework.
I would love to switch to C# since it enables an incredible boost in productivity and simply is a great piece of technology from Microsoft, but there is no decent GUI framework available:
Windows Forms allows to very quickly build a GUI, but it is essentially abandoned. There are fundamental unsolvable issues with High-DPI screens, so this is a no go.
WPF has a steep learning curve, and investments in it’s future are unclear. Moreover, I get Windows Desktop only. No mobile, no cross-platform. Essential controls are abandoned or missing, like the WPF Ribbon, and you have to resort to 3rd party controls or open source projects (Fluent.Ribbon).
UWP is also essentially Windows only, and moreover Windows 10 only. Lots of people still running Win7 or 8.1. The severe limitations, like no process control and the lack of inter-process communication via pipes make this impossible for me to use.
Xamarin.Forms is interesting, but also not very mature, it’s future next to UWP is unclear. The Windows port is limited to UWP with the problems as mentioned above, and OSX and Linux are impossible.
Also there is the dogfeeding issue: What is Microsoft investing in for desktop applications? Microsoft Office is still and will be still running on plain Win32 with their own GUI abstraction layer. Haven’t seen UWP aside from trivial apps live Groove or some setting wizards.
No other major desktop application (as in huge, no toy projects) vendor is investing in UWP or WPF. Maya and Photoshop Elements are based on Qt, LibreOffice has their own abstraction layer, and it goes on and on.
With Qt I get Windows, Linux, Mac, OS X, Android and iOS, all with the same application base. Also Qt5 is stable since 2012, and if you developed an application with Qt3 in 2001 and ported it to Qt4 and 5 with little effort, it’s still looking modern and usable. That’s stability and development convenience for 18 years!
It’s sad to see how much Microsoft abandoned the desktop and GUI frameworks. It’s the fundamental base of Windows’ success. Due to Microsoft’s unclear path and hence and forth with their platform strategy, there is a fundamental lack of trust, and developers are wondering what they will invest in. And I didn’t even mention the threat from web applications for the classical desktop platform…
I switched to Embarcadero’s RAD Studio product. It gives me the ability to target Windows 7 (classic Win32), Windows 10 Store apps through the bridge, iOS, Android, and Linux server applications. Also, through the use of RAD Server, I can create compelling REST APIs. And, both the VCL and Firemonkey frameworks support HDPI. Super nice tech.
After having used many UWP apps at work over the past year or so, the only such I have come to like in any way is Teams, which is a superb collaboration platform. It scores mainly because of its cross-platform capabilities. Not because UWP makes for a better user experience.
I have written an awful lot of WPF code now but have yet to write any UWP stuff. Perhaps this is because I haven’t come across any scenarios that make it a compelling option.