Wie kann ich Flimmern in einer WPF-Vollbild-App vermeiden?

Ich habe eine WPF-Anwendung, die eine Vollbild-Kiosk-App ist. Momentan ist es eine ziemlich komplizierte App, aber hier ist ein Code, der die Grundidee zeigt. Wenn der Benutzer von einem Bildschirm zum nächsten wechselt, wird im Wesentlichen das neue Fenster durch ein schwerwiegendes Flimmern angezeigt. In schweren Fällen wird der Desktop einige Sekunden lang angezeigt, bevor der neue Bildschirm angezeigt wird. Das passiert in diesem Beispielcode nicht, weil es so einfach ist, aber fügen Sie ein paar weitere Schaltflächen und Stile hinzu, und Sie werden es sehen.

App.xaml.cs:

public partial class App : Application {
    Manager mManager;
    public App() {
        mManager = new Manager();
        Window1 screen1 = new Window1(mManager);
        mManager.Screen1 = screen1;
        try {
            this.Run(screen1);
        } catch (Exception e) {
            System.Console.WriteLine(e.ToString());                
        } finally {
            Application.Current.Shutdown();
        }
    }
}

Window1.xaml.cs:

public partial class Window1 : Window {
    Manager Manager{get; set;}
    public Window1(Manager inManager) {
        InitializeComponent();
        Manager = inManager;
    }

    private void OnChangeScreen(object sender, RoutedEventArgs e) {
        Manager.OpenScreen2();
    }
}

Window2.xaml.cs:

public partial class Window2 : Window {
    Manager Manager{get; set;}
    public Window2(Manager inManager) {
        InitializeComponent();
        Manager = inManager;
    }

    private void OnChangeScreen(object sender, RoutedEventArgs e) {
        Manager.OpenScreen1();
    }
}

Manager.cs:

public class Manager {
    public Window1 Screen1{ get; set;}
    public Window2 Screen2{ get; set;}

    public Manager(){
        Screen1 = new Window1(this);
    }

    public void OpenScreen2() {
        Screen2 = new Window2(this);
        Screen2.Show();
        if (Screen1 != null) {
            Screen1.Hide();
        }
    }

    public void OpenScreen1() {
        Screen1 = new Window1(this);
        Screen1.Show();
        if (Screen2 != null) {
            Screen2.Hide();
        }
    }
}

Window1.xaml (im Wesentlichen imitiert von window2.xaml):

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" 
        WindowStyle="None"
        WindowState="Maximized"
        Width="1280"
        Height="1024"
        FontFamily="Global User Interface"
        ResizeMode="NoResize">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Button Name="ChangeScreenButton" Click="OnChangeScreen" Grid.Row="2" Grid.Column="2" Content="Toggle Screen 2"></Button>
    </Grid>
</Window>

Durch das Verschachteln der Anzeigen der beiden Fenster (dh Anzeigen von Fenster 1 vor dem Löschen von Fenster 2 usw.) wird das Flackerverhalten nicht geändert. In dieser einfachen App können die anderen nicht angezeigten Bildschirme einfach ausgeblendet werden. In der komplizierteren App sind jedoch zu viele Statusinformationen vorhanden, um die Bildschirminformationen ordnungsgemäß und einfach verwalten zu können.

Gibt es ein magisches Codewort oder eine Technik, um Flimmern zu vermeiden, das bzw. die in dieser einfachen App funktionieren würde, die sich auch auf die komplexere App skalieren lässt? Ich mache mir Sorgen, dass ich an diesem Punkt die gesamte Benutzeroberfläche neu schreiben muss, um das Ausblenden und Anzeigen zu unterstützen, und das ist in meinem Zeitrahmen einfach nicht machbar.

BEARBEITEN: Ich habe das Verstecken / Zeigen-Ding in einigen Dialogen ausprobiert und es scheint einfach keine Rolle zu spielen. Vielleicht liegt es daran, dass die Haupt-Kiosk-App viel Stil hat?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage