2009-04-05 11 views
5

Dans mon programme j'ai trois états distincts de l'IU (Normal, Succès et Erreur) et dans chacun les contrôles sont visibles/cachés, activés/désactivés, les couleurs changent, les étiquettes disent des choses différentes ... etc. et dans mon code-behind je veux fondamentalement pouvoir dire ChangeWindowState (UI.Normal); Donc, ma question est la meilleure façon de mettre en œuvre les changements de contrôle pour chaque état?Quelle est la meilleure façon de mettre en œuvre une machine d'état de l'interface utilisateur?

Bien sûr, je pourrais changer manuellement les contrôles dans le code-behind, mais je me demande s'il y a peut-être une meilleure façon d'utiliser les thèmes ou les styles wpf. Alors peut-être que je pourrais juste définir la fenêtre pour utiliser le thème "Erreur", que j'ai prédéfini. Je ne les comprends pas vraiment pour le moment, donc j'utilise peut-être mal la terminologie, mais j'apprécierais que quelqu'un puisse me diriger dans la bonne direction pour faire quelque chose comme ça.

Merci!

Répondre

5

Il y a plusieurs façons d'aborder cela, bien sûr. Si vous avez un "modèle d'objet" d'état du programme, vous pouvez utiliser une combinaison de DataTemplates et de DataTriggers. À supposer que ce ne soit pas le cas, voici une autre approche: Vous avez parlé d'une fenêtre, de sorte que vous supposez définir une « propriété de dépendance » dans votre classe de fenêtre comme ceci:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     this.InitializeComponent(); 

     // Insert code required on object creation below this point. 
    } 

    public ProgramStatus ProgramStatus 
    { 
     get { return (ProgramStatus)GetValue(ProgramStatusProperty); } 
     set { SetValue(ProgramStatusProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ProgramStatus. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ProgramStatusProperty = 
     DependencyProperty.Register("ProgramStatus", typeof(ProgramStatus), typeof(Window1), new UIPropertyMetadata(null)); 
} 

public enum ProgramStatus 
{ 
    Normal, 
    Success, 
    Error 
} 

Maintenant vous pouvez changer à peu près toute propriété de tout élément de la fenêtre (y compris la fenêtre elle-même), soit par liaison directe ou par un déclencheur. Voici un exemple de changer la couleur de fond de la fenêtre via un déclencheur de propriété:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:l="clr-namespace:Test" 
    x:Class="Test.Window1" 
    x:Name="Window" 
    Title="Window1" 
    Width="640" Height="480"> 
    <Window.Style> 
     <Style TargetType="{x:Type l:Window1}"> 
      <Style.Triggers> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Error</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Red" /> 
       </Trigger> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Normal</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Blue" /> 
       </Trigger> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Success</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Green" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Style> 
    <Grid x:Name="LayoutRoot"/> 
</Window> 
1

Pour ce genre de chose j'ai presque toujours fait une fonction "UpdateUI()". Cette fonction regarde l'état des propriétés/état du modèle/membre et active/désactive, cache/montre, peu importe. Essayer de diffuser ce code conduit toujours à un problème (ainsi "ChangeWindowsState (..)" définit simplement une propriété et appelle ensuite "UpdateUI()").

J'ai vu quelques tentatives de gérer cela de manière générique ... mais aucune que j'ai vraiment aimé (par exemple les trucs WTL). Généralement, ceux-ci ne sont pas mal mis en œuvre ... mais simplement facile de dépasser rapidement ce qu'ils peuvent faire. Et généralement, la logique d'état est suffisamment importante pour la coder explicitement avec une simple logique de style if/then/else qui conduit à moins de confusion (maintenance, débogage, etc.).

Questions connexes