У меня есть приложение 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, и т.д.) не меняет поведение мерцающий. В этом простом приложении можно было бы просто скрыть другие экраны, которые не отображаются, но в более сложном приложении слишком много информации о состоянии для правильного и удобного управления экранной информацией.
Есть ли какое-нибудь волшебное кодовое слово или техника, чтобы избежать мерцания, которое будет работать в этом простом приложении, которое также масштабируется до более сложного приложения? Я обеспокоен тем, что в этот момент мне придется переписать весь пользовательский интерфейс, чтобы поддерживать скрытие и показ, и это просто невозможно в мои временные рамки.
EDIT: Я пробовал скрывать/показывать вещи на некоторых диалогах, и это просто не имеет значения. Может быть, это потому, что основное приложение для киоска отличается тяжелым стилем?
Спасибо за объяснение. – mmr