A Minimal UWP App
Introduction
The introduction of Windows Template Studio makes it easy to set up a well-formed Universal Windows Platform (UWP) app that implements the (Model-View-View Model) MVVM design pattern according to best practices in no time.
This kind of wizard-based experiences may be appealing to some developers, but in this articleI will show how you can create a minimal UWP app from scratch without using any wizards nor auto-generated code.
When you create a new UWP app using the Blank App (Windows Universal)
template in Visual Studio, it generates two code files for you, namely App.xaml.cs
and MainWindow.xaml.cs
. When you then build the app it also automagically generates an entry point (Main
) method.
DISABLE_XAML_GENERATED_MAIN
If you delete both App.xaml
and MainWindow.xaml
, including the code-behind files, and add the DISABLE_XAML_GENERATED_MAIN
compilation symbol under Project->Properties->Build->General, you have effectively removed all auto-generated code and now have a truly “blank” app. If you try to build at this point, you should get an error saying the “Program does not contain a static ‘Main’ method suitable for an entry point”.
http://magnusmontin.files.wordpress.com/2017/10/vsbuild.png?w=921&h=273
Defining a custom entry point is easy. Just create a class with a static Main
method that calls the static Start
method of the Windows.UI.Xaml.Application
class:
public class Program : Application
{
static void Main(string[] args)
{
Start(_ => new Program());
}
}
That’s all code that is required to get a minimal UWP app up and running. If you build and run the application at this stage, you should see a blank window pop up that you can resize and move around just as usual.
https://magnusmontin.files.wordpress.com/2017/10/blankapphw.png?w=518&h=354
ApplicationInitializationCallback
The Application.Start
method accepts a ApplicationInitializationCallback
delegate that is supposed to create an instance of the Application
class. This class will take care of the process of creating and initializing the app’s core window and dispatcher to start processing and dispatching window messages.
You can then simply override the OnLaunched
method to set the Content
of the window to any UIElement
:
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
base.OnLaunched(args);
Window.Current.Content = new TextBlock
{
Text = "Hello world!",
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
FontSize = 40
};
Window.Current.Activate();
}
In the above sample code, I have set the Content
property to a TextBlock
but you can of course set it to whatever UIElement
you want including a Page
or a UserControl
. These could for example be defined in a stand-alone class library that you reference from the app itself.
In a real-world app, you may obviously want to extend the Program
class to handle things such as navigation and lifecycle management but that’s out of the scope of this article.
Application Package Manifest
Besides the single class that derives from Application
, you also need an application package manifest to be able to run a UWP app. Visual Studio creates one for you. A package manifest is nothing but an XML document. If you right-click on the auto-generated Package.appxmanifest
file and choose “View Code”, you can easily see and the edit its contents.
The manifest contains the information that Windows needs to be able deploy the app. This includes a package identity, package dependencies, required capabilities, and extensibility points. If you want to, you can easily create a basic and minimal package manifest yourself using any text editor you want and replace the auto-generated one with this one.
The manifest also describes some visual aspects of the app, that is its default tile, logo images, text and background colors, initial screen orientation, splash screen, and lock screen tile appearance. One thing to point out here is the ability to generate visual assets of different sizes automatically using a single source file. You can do this using the asset generator in Visual Studio 2017. You will find it under the “Visual Assets” tab in the package manifest designer which you can open by right-clicking on the appxmanifest file and choose “View Designer”, or just “Open” if you haven’t modified the default settings.
This is a nice “auto” feature. I certainly don’t mind having the required image files auto-generated for me by Visual Studio but I usually prefer to write most part of the actual code myself and start from scratch when I develop a new application.