У меня есть приложение 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 и т. Д.) Не меняет поведение мерцания. В этом простом приложении можно было бы просто скрыть другие не показанные экраны, но в более сложном приложении слишком много информации о состоянии, чтобы правильно и легко управлять информацией на экране.
Существует ли какое-нибудь волшебное кодовое слово или методика, позволяющая избежать мерцания, которое будет работать в этом простом приложении, которое также масштабируется до более сложного приложения? Я боюсь, что на этом этапе меня заставят переписать весь пользовательский интерфейс, чтобы поддерживать скрытие и отображение, а это просто невозможно в мой период времени.
РЕДАКТИРОВАТЬ: Я пытался скрыть / показать вещь в некоторых диалогах, и это просто не имеет значения. Может быть, это из-за того, что главное приложение киоска - это стиль, тяжелый?