11
votes

Comment puis-je éviter le scintillement dans une application FullScreen WPF?

J'ai une application WPF qui est une application de kiosque en plein écran. C'est en fait une application assez compliquée à ce stade, mais voici quelques codes qui montre l'idée de base. Essentiellement, chaque fois que l'utilisateur passe d'un écran à l'autre, il y a un scintillement grave pour faire ressortir la nouvelle fenêtre. Dans des cas graves, le bureau est affiché pendant quelques secondes avant que le nouvel écran ne s'affiche. Cela n'arrive pas dans cet exemple de code, car il est si simple, mais ajoutez quelques autres boutons et styles et vous le verrez.

app.xaml.cs: p>

<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>


0 commentaires

8 Réponses :


2
votes

Je suis curieux de savoir pourquoi vous utilisez plusieurs fenêtres pour la même application dans un kiosque. Vous pouvez facilement mettre toutes les commandes sur la même "fenêtre" et simplement changer la visibilité sur des panneaux pour afficher différents "écrans". Cela empêcherait certainement que le bureau soit déjà montré et vous permettrait de faire des choses soignées comme des transitions fondues ou des animations coulissantes, etc.


2 commentaires

C'est une idée très très intéressante. Je ne sais pas combien de temps il faudrait pour changer de choses à cette approche (à nouveau, les problèmes d'état; cela était une application WinForms commutée sur WPF), mais cela vaudra peut-être une expérience ou deux.


Une autre idée qui peut empêcher cela ... s'il prend beaucoup de temps pour afficher des fenêtres ultérieures, cela peut être dû à l'enlèvement de l'ordinateur enlèvement d'essayer d'essayer tout. Vous voudrez peut-être "montrer" toutes les fenêtres au démarrage et basculer entre eux en activant la fenêtre souhaitée. De cette façon, il s'agit simplement de Windows commutant la fenêtre active (en haut) par opposition à avoir à repasser tous les composants de chaque transition.



2
votes

WPF a intégré une fonctionnalité de navigation.

Il suffit de regarder le cadre et les classes de page que vous pouvez facilement concevoir avec vs ou mélange.


0 commentaires

0
votes

convenu avec les commentaires sur l'utilisation de la fonctionnalité de navigation intégrée, mais si vous êtes enfermé dans votre conception à ce stade, vous envisagez peut-être d'animer l'opacité de vos fenêtres? Une animation à 100 ou 200 ms d'opacité de 1 -> 0 pour la fenêtre sortante et 0 -> 1 pour la fenêtre entrante pourrait résoudre le problème. Gérer le nettoyage réel de la fenêtre sortante dans l'événement terminé sur le storyboard.


4 commentaires

Une idée soignée, mais on m'a dit que je ne suis pas autorisé à être créatif avec quoi que ce soit comme ça, juste pour que les choses montrent plus rapidement.


Si votre préoccupation est l'ensemble de la séparation des concepteurs / développeurs, vous pouvez créer le storyboard en code pour éviter les problèmes avec des animations existantes. Si c'est juste un problème de politique, eh bien ... je suppose qu'ils aiment leur scintillement. :)


C'est plus un "qui ressemble à l'art pour moi! Tu es un codeur, tu n'es pas autorisé à être un artiste! Ce n'est pas ce que nous vous payons! Retournez aux mines!" sorte de mentalité.


Ah ... toujours utile. Espérons que c'est quelque chose que WPF peut vous aider à dépasser ... Ces petites transitions aident vraiment la convivialité et les impressions utilisateur et elles sont assez faciles à faire.



0
votes

Voir comment WPF utilise DirectX et le processeur graphique pour décharger le traitement des éléments d'écran, sont DirectX et les pilotes de l'ordinateur à jour?

Cory


1 commentaires

Cela se passe sur chaque machine que l'application est testée et elles doivent toutes être entièrement mises à jour. Si .NET Nécessite plus de pilotes DirectX Soyez installé, je penserais que cela ferait partie de l'installateur ... mais ma machine de développement a certainement le plus récent DirectX installé et scintille ici.



0
votes

Si vous avez une initialisation dans le constructeur qui prend beaucoup de temps pouvant causer un retard et un scintillement. Vous pouvez essayer d'utiliser une méthode asynchrone ou mettez cette initialisation sur un fil d'arrière-plan afin qu'il ne bloque pas la présentation de la fenêtre.

Un exemple de quelque chose qui causerait un retard serait une requête de base de données ou une demande de données sur un réseau.

Une expérience rapide serait de désactiver des pièces du constructeur dans une fenêtre lente pour savoir ce qui cause de retard dans la fenêtre.


0 commentaires

15
votes

La cause sous-jacente du scintillement est que chaque fois que vous .hide () une fenêtre Son présentationsource Source est déconnectée, provoquant des événements non chargés sur tout et tout cache La couche milcore de WPF à supprimer. Ensuite, lorsque vous .SHOW () La plus tard, tout est reconstruit.

Pour éviter tout scintillement, assurez-vous de garder votre interface utilisateur connectée à une présentations à tout moment. Cela peut être fait de plusieurs manières:

une fenêtre unique avec un tabcontrol déguisé

Utilisez une seule fenêtre contenant un Tabcontrol style Donc, vous ne pouvez pas voir les onglets. Commutation des onglets dans le code lorsque vous montreriez normalement ou masquer Windows. Vous pouvez simplement rechercher et remplacer "la fenêtre" dans votre code existant avec "page", puis remplacer "Afficher ()" Appels à votre personnalisé "Afficher ()" Qui effectue les suivantes:

  1. Vérifiez le Tabitem précédemment créé pour cette page (à l'aide d'un dictionnaire)
  2. Si aucun tabitem n'a été trouvé, enveloppez la page dans un nouveau tabitem et ajoutez-la au Tabcontrol
  3. commutateur le tabcontrol sur le nouveau Tabitem

    La plaque conteneur que vous utiliseriez pour votre tabcontrol est extrêmement simple: xxx

    à l'aide d'un cadre avec la navigation

    Utiliser Cadre avec la navigation est une très bonne solution pour un kiosque car elle implémente beaucoup de la commutation de page et d'autres fonctionnalités. Cependant, il peut être plus utile de mettre à jour une application existante de la manière que d'utiliser un tabcontrol. Dans les deux cas, vous devez convertir de fenêtre à page , mais avec la trame, vous devez également traiter la navigation.

    Plusieurs fenêtres avec Opacité

    Vous pouvez faire une fenêtre presque complètement invisible en utilisant une faible opacité et pourtant WPF gardera toujours l'arborescence visuelle. Ce serait un changement trivial: il suffit de remplacer tous les appels à window.show () et window.hide () avec des appels sur "MyHide ()" et "MyShow ()" "Ce qui met à jour l'opacité. Notez que vous pouvez l'améliorer davantage en ayant ces routines déclenchent des animations de très courte durée (par exemple, 0,2 seconde) qui animent l'opacité. Étant donné que les deux animations seront définies en même temps, l'animation se déroulera en douceur et ce sera un effet soigné.


0 commentaires

0
votes

AS donné répondu plus tôt en utilisant des cadres / des commandes d'onglet, évitez le scintillement pendant les transitions

Si vous ne voulez pas modifier votre application et que vous souhaitez supprimer ce scintillement (clignotant du bureau entre les deux) sur Windows7 ou WindowsVista, vous pouvez optimiser les paramètres de votre Windows 'Visual Effects' pour être " ajuster les meilleures performances "


1 commentaires

Ce n'est pas vraiment une solution générale ... Nous ne pouvons pas demander à tous nos clients d'éteindre les thèmes de bureau en raison de notre incapacité de codage. Nous devons juste aller mieux.



0
votes

Voici une alternative facile qui fonctionne pour moi dans mon application de type kiosque avec un fond noir, inspiré des réponses ci-dessus. Ici, j'ai un "langagewindow" qui peut être ouvert de n'importe où dans l'application pour modifier la langue actuelle.

dans LanguageWindow.xaml (Vérifiez la fenêtreState = minimisée): P>

Private Sub LanguageWindow_ContentRendered(sender As Object, e As EventArgs) Handles Me.ContentRendered
    Me.WindowState = WindowState.Maximized
End Sub


0 commentaires