Kolumne XAML Expertise: WPF und Windows-Apps

XAML-Tipp: UWP – App per Code neu starten
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „UWP – App per Code neu starten“.

Ein weiteres neues Feature des Windows 10 Fall Creators Updates ist das Neustarten der App mittels Programmcode. Zuvor musste die App den Benutzer freundlich darauf hinweisen, dass dieser bitte die App schließen und neu starten soll, um bestimmte Einstellungen übernehmen zu können. Was die Benutzerführung betrifft, ist das natürlich ein Minuspunkt. Jetzt kann die App automatisch mittels Programmcode neu gestartet werden.

Das Restart-API bietet zwei unterschiedliche Funktionen: Zum einen ein klassisches Neustarten mit der RequestRestartAsync-Methode und zum anderen einen benutzerspezifischen Neustart mittels RequestRestartForUserAsync. Das folgende Beispiel zeigt beide Funktionen im Einsatz. Zunächst wird eine neue Windows-App mit einem TextBlock-Element und zwei Buttons angelegt. Listing 1 zeigt den XAML-Code der MainPage.xaml. In der MainPage.xaml.cs-Datei wird dann die erste Button-Klick-Logik implementiert. Diese ruft normalerweise die CoreApplication.RequestRestartAsync-Methode auf. Zusätzlich kann man einen bestimmten Status übergeben, der beim Starten der App über die Argumente übertragen wird. Daher wird hierbei im Konstruktor auf eine Property der App.cs-Datei zugegriffen. Den Code für den ersten Button zeigt Listing 2. Die Property mit dem Zuweisen der Argumente wird folgendermaßen dargestellt:

public static string ArgInfo { get; internal set; }

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
  ArgInfo = e.Arguments;
  ...

Anschließend kann die App getestet werden. Am besten funktioniert das Ausführen des Neustarts ohne Debug-Modus. Dazu die App mittels STRG + F5 starten. Nach dem Neustart wurde der übertragene Statuswert in das TextBlock-Element geschrieben (Abb. 1).

Abb. 1: Windows-App per Code neustarten

Abb. 1: Windows-App per Code neustarten

Soll der Neustart nur für einen bestimmten Benutzer infrage kommen, wird diese Funktion über die CoreApplication.RequestRestartForUserAsync-Methode ermöglicht. Diese bekommt das gewünschte Userobjekt über die Windows.System.User-Klasse. Die entsprechende Logik für den zweiten Button ist in Listing 3 zu finden. Ein Beispielprojekt dazu gibt es von Microsoft auf GitHub.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <Grid.RowDefinitions>
    <RowDefinition Height="150"/>
    <RowDefinition Height="*"/>
  </Grid.RowDefinitions>
  <TextBlock x:Name="tbTitle" FontSize="32" Margin="40"/>
  <StackPanel Grid.Row="1" Margin="40">
    <Button Click="Button1_Click">Neustart</Button>
    <Button Click="Button2_Click">Neustart nach Benutzername</Button>
  </StackPanel>
</Grid>
public MainPage()
{
  this.InitializeComponent();

  tbTitle.Text = "Restart Application Sample";

  if (App.ArgInfo != null)
    tbTitle.Text = App.ArgInfo;
}

private async void Button1_Click(object sender, RoutedEventArgs e)
{
  var result = await CoreApplication.RequestRestartAsync("Application Restart Programmatically");

  if (result == AppRestartFailureReason.NotInForeground ||
    result == AppRestartFailureReason.RestartPending ||
    result == AppRestartFailureReason.Other)
  {
    var msgBox = new MessageDialog("Restart Failed", result.ToString());
    await msgBox.ShowAsync();
  }
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
  var userList = await User.FindAllAsync();

  var users = new List()
  {
    KnownUserProperties.FirstName
  };

  foreach (var user in userList)
  {
    var accountName = await user.GetPropertiesAsync(users);

    if (accountName != null)
    {
      var name = accountName[KnownUserProperties.FirstName].ToString();
      if (name == "Gregor")
      {
        AppRestartFailureReason result = await CoreApplication.RequestRestartForUserAsync(user, "user based Restart");
      }
    }
  }
}
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -