Как избежать мерцания в полноэкранном приложении WPF?

У меня есть приложение WPF, которое представляет собой полноэкранное приложение киоска. Это на самом деле довольно сложное приложение на данный момент, но вот код, который показывает основную идею. По сути, всякий раз, когда пользователь переходит с одного экрана на другой, появляется новое серьезное мерцание. В серьезных случаях рабочий стол отображается за несколько секунд до появления нового экрана. В этом примере кода этого не происходит, потому что это так просто, но добавьте еще несколько кнопок и стилей, и вы увидите это.

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 (по сути имитируется 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>

Чередование отображений двух окон (т.е. показ окна 1 перед удалением окна 2 и т. Д.) Не меняет поведение мерцания. В этом простом приложении можно было бы просто скрыть другие не показанные экраны, но в более сложном приложении слишком много информации о состоянии, чтобы правильно и легко управлять информацией на экране.

Есть ли какое-то волшебное кодовое слово или техника, чтобы избежать мерцания, которое будет работать в этом простом приложении, которое также масштабируется до более сложного приложения? Я беспокоюсь о том, что на этом этапе я буду вынужден переписать весь пользовательский интерфейс, чтобы поддерживать скрытие и показ, и это просто невозможно в мой период времени.

РЕДАКТИРОВАТЬ: я пытался скрыть / показать вещь в некоторых диалогах, и это просто не имеет значения. Может быть, это потому, что основное приложение киоска - это стиль, насыщенный?

Ответы на вопрос(8)

Ваш ответ на вопрос