Back to Uno

Counter App using XAML and MVUX

doc/articles/getting-started/counterapp/get-started-counter-xaml-mvux.md

6.6-release-branch-cut8.4 KB
Original Source

Counter App using XAML and MVUX

Download the complete XAML + MVUX sample

[!INCLUDE Intro]

In this tutorial you will learn how to:

  • Create a new Project with Uno Platform using Visual Studio Template Wizard or the dotnet new command
  • Add elements to the XAML file to define the layout of the application
  • Add code to the C# file to implement the application logic using the Model-View-Update-eXtended (MVUX) pattern
  • Use data binding to connect the UI to the application logic

To complete this tutorial you don't need any prior knowledge of the Uno Platform, XAML, or C#.

[!INCLUDE VS]

Visual Studio

[!NOTE] If you don't have the Uno Platform Extension for Visual Studio installed, follow these instructions.

  • Launch Visual Studio and click on Create new project on the Start Window. Alternatively, if you're already in Visual Studio, click New, Project from the File menu.

  • Type Uno Platform in the search box

  • Click Uno Platform App, then Next

  • Name the project Counter and click Create

At this point you'll enter the Uno Platform Template Wizard, giving you options to customize the generated application. For this tutorial, we're only going to configure the markup language and the presentation framework.

  • Select Blank in Presets selection

  • Select the Presentation tab and choose MVUX

  • Select the Markup tab and choose XAML

Before completing the wizard, take a look through each of the sections and see what other options are available. You can always come back and create a new project with different options later. For more information on all the template options, see Using the Uno Platform Template.

  • Click Create to complete the wizard

The template will create a solution with a single cross-platform project, named Counter, ready to run.

Rider

[!NOTE] If you don't have the Uno Platform Extension for Rider installed, follow these instructions.

  • Launch Rider and click on New Solution on the Start Window

  • From the left menu, under the Uno Platform section, select Uno Platform App At this point, you'll see options for creating a new Uno app, allowing you to customize the generated application. For this tutorial, we will only configure the presentation framework.

  • Name the project Counter

  • Select Blank in Presets selection

  • Select the Presentation tab and choose MVUX

  • Select the Markup tab and choose XAML Markup

  • Click Create to complete the creation The template will create a solution with a single cross-platform project, named Counter, ready to run.

VS Code

[!NOTE] If you don't have the Uno Platform Extension for VS Code installed, follow these instructions.

  • Launch The Live Wizard by visiting the Uno Platform Live Wizard

  • Name the project Counter and click Start

  • Select Blank in Presets selection

  • Select the Presentation tab and choose MVUX

  • Select the Markup tab and choose XAML Markup

  • Click Create to complete the wizard

  • Copy the dotnet new command and run it from a terminal where you want your solution to be located.

  • This will create a new folder called Counter containing the new application.

  • Next, open the project using Visual Studio Code. In the terminal type the following:

    bash
    code ./Counter
    
  • Visual Studio Code might ask to restore the NuGet packages. Allow it to restore them if asked.

  • Once the solution has been loaded, in the status bar at the bottom left of VS Code, Counter.sln is selected by default. Select Counter.csproj to load the project instead.

Command Line

[!NOTE] If you don't have the Uno Platform dotnet new templates installed, follow dotnet new templates for Uno Platform.

From the command line, run the following command:

dotnetcli
dotnet new unoapp -preset blank -presentation mvux -markup xaml -o Counter

This will create a new folder called Counter containing the new application.

If you want to discover all the options available in the unoapp template, run the following command:

dotnetcli
dotnet new unoapp -h

Also, for more information on all the template options, see Using the Uno Platform Template.


[!INCLUDE Counter Solution]

[!INCLUDE Main Window]

[!INCLUDE Main Page - XAML]

[!INCLUDE Main Page - Layout]

[!INCLUDE Main Page - Image]

[!INCLUDE Main Page - Change Layout]

[!INCLUDE Main Page - Other Elements]

[!INCLUDE Main Model]

Data Binding

As the application uses MVUX, the MainModel class is used to generate a bindable ViewModel, MainViewModel. We can update the MainPage to use data binding to connect the UI to the application logic.

  • Add a DataContext element to the Page element in the MainPage.xaml file.

    xml
    <Page.DataContext>
        <local:MainViewModel />
    </Page.DataContext>
    
  • Update the TextBlock by removing the Text attribute, replacing it with two Run elements, and binding the Text property of the second Run element to the Countable.Count property of the MainViewModel.

    xml
    <TextBlock Margin="12"
               HorizontalAlignment="Center"
               TextAlignment="Center">
        <Run Text="Counter: " /><Run Text="{Binding Countable.Count}" />
    </TextBlock>
    
  • Update the TextBox by binding the Text property to the Countable.Step property of the MainViewModel. The Mode of the binding is set to TwoWay so that the Countable.Step property is updated when the user changes the value in the TextBox.

    xml
    <TextBox Margin="12"
             HorizontalAlignment="Center"
             PlaceholderText="Step Size"
             Text="{Binding Countable.Step, Mode=TwoWay}"
             TextAlignment="Center" />
    
  • Update the Button to add a Command attribute that is bound to the IncrementCounter task of the MainViewModel.

    xml
    <Button Margin="12"
            HorizontalAlignment="Center"
            Command="{Binding IncrementCounter}"
            Content="Increment Counter by Step Size" />
    

The final code for MainPage.xaml should look like this:

xml
<Page x:Class="Counter.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:Counter"
      Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <Page.DataContext>
    <local:MainViewModel />
  </Page.DataContext>
  <StackPanel VerticalAlignment="Center">
    <Image Width="150"
           Height="150"
           Margin="12"
           HorizontalAlignment="Center"
           Source="Assets/logo.png" />

    <TextBox Margin="12"
             HorizontalAlignment="Center"
             PlaceholderText="Step Size"
             Text="{Binding Countable.Step, Mode=TwoWay}"
             TextAlignment="Center" />

    <TextBlock Margin="12"
               HorizontalAlignment="Center"
               TextAlignment="Center">
        <Run Text="Counter: " /><Run Text="{Binding Countable.Count}" />
    </TextBlock>

    <Button Margin="12"
            HorizontalAlignment="Center"
            Command="{Binding IncrementCounter}"
            Content="Increment Counter by Step Size" />
  </StackPanel>
</Page>

[!INCLUDE Wrap Up]

If you want to see the completed application, you can download the source code from GitHub.