2010-12-06 21 views
3

Nous écrivons une application basée sur Prism Silverlight et nous avons un ensemble de pages dans des modules distincts.Comment puis-je partager VisualStateManager entre deux (ou plusieurs) fichiers XAML?

La transition entre les pages est gérée par les événements de navigation et chaque module a les méthodes suivantes mises en œuvre pour afficher la page quand vous y naviguez et se cacher quand naviguer à partir de:

public void Show() 
{ 
    VisualStateManager.GoToState(this, "ShowState", true); 
} 

public void Hide() 
{ 
    VisualStateManager.GoToState(this, "HideState", true); 
} 

Au moment « ShowState » et "HideState" sont définis dans le fichier XAML de chaque module et sont dupliqués beaucoup trop souvent.

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStates"> 
      <VisualState x:Name="ShowState"> 
       ... 
      </VisualState> 
      <VisualState x:Name="HideState"> 
       ... 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

Lorsque ... représente le Storyboard pour chaque transition.

J'ai juste repéré une erreur dans les définitions Storyboard et pour l'instant je vais devoir répliquer le correctif dans tous les fichiers. Il serait préférable qu'il n'y ait qu'une seule définition du Storyboard qui pourrait être référencée dans chaque fichier.

J'ai cherché toute la matinée pour la bonne syntaxe mais n'ai eu aucune chance quoi que ce soit.

Comment puis-je partager ce VisualStateManager entre tous nos fichiers XAML?

+0

Il semble que vous souhaitiez encapsuler le 'comportement' dans un contrôle personnalisé. De cette façon, vous réutiliserez simplement le contrôle au besoin, ce qui encapsulera votre Storyboard, fournissant ainsi un point de référence unique pour résoudre les problèmes au fur et à mesure qu'ils surviennent. Je suppose que c'est quelque chose qui ressemble à un Expander ou autre; fournir des fonctionnalités communes à tous les enfants de ce conteneur. –

Répondre

2
<Storyboard x:Key="ShowStoryboard"> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

<VisualState x:Name="ShowState"> 
    <BeginStoryboard Storyboard="{StaticResource ShowStoryboard}"/> 
</VisualState> 

référencez votre storyboard au sein XAML peut être fait comme on le voit ci-dessus. Avec la partie la plus haute étant un Storyboard stocké comme une ressource quelque part. Après cela, vous devriez être en mesure d'utiliser la référence BeginStoryboard dans votre VisualState.

EDIT: Ce qui précède semble possible dans WPF, mais ce n'est pas possible dans SL. À ce jour, il ne semble pas possible de réutiliser un Storyboard ou un VisualState dans SL. Vous devriez toujours pouvoir réaliser ce que vous essayez de faire en encapsulant le comportement VisualStateManager dans un style appliqué à un contrôle personnalisé. Cela vous fournirait le point d'échec unique que vous recherchez.

+0

J'espérais référencer la totalité de 'VisualStateManager' mais avoir les définitions' Storyboard' en un seul endroit ferait l'affaire;) – ChrisF

+1

Cela ne fonctionne pas. 'BeginStoryboard' n'est pas reconnu comme XAML valide et si je fais simplement ', je reçois une erreur lors de l'initialisation. – ChrisF

+0

@ChrisF BeginStoryboard est en effet actif dans SL; Cependant, il a limité dans Triggers et peut-être dans un VisualState n'est pas acceptable (c'est dans WPF), laissez-moi voir ce que je peux battre ... –