2009-08-08 9 views
4

J'ai ce controltempalte + trigger stuff dans mon application WPF.ControlTemplate.Triggers Équivalent WPF dans Silverlight 3

<ControlTemplate TargetType="me:MyControl" x:Key="fade"> 
    <ContentPresenter - other stuff /> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsTransitioned" Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation -<stuff>- />         
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Cela fonctionne très bien dans WPF, et est très intuitif aussi pour moi d'écrire ceci basé sur le déclenchement comme ci-dessus. Quand je porte ceci à Silverlight (3), on m'informe que je dois utiliser VSM, les états et les groupes etc. puisque les déclencheurs sur le modèle de contrôle ne sont pas supportés. J'ai regardé quelques échantillons, et j'ai même essayé d'appliquer les bits VSM, à la place du trigger comme ci-dessus, mais je n'arrive pas à le faire fonctionner.

Quelqu'un m'a suggéré que, à part VSM dans le XAML, je vais devoir gérer certains événements, etc. modèle

SL3 vient d'être douloureux pour moi. S'il vous plaît aider.

+0

Hmm, pour une partie de la raison de mon post n'est pas rendu ... -à-dire ce peu au-dessus de mon extrait de code ... Mais anywya, vous avez l'idée de mon problème. ce qui est plus important :-) –

+0

Tout le code doit être inden TED par 4 espaces donc SO sait que c'est un extrait de code. Le moyen le plus rapide de le faire est de sélectionner tout votre code dans Visual Studio et appuyez sur l'onglet avant de le copier. Je pense que sinon, il pense que c'est censé être du HTML et comme ça ne l'est pas, il l'ignore. – mattmanser

+0

Merci mattmanser. Thnx pour la pointe indentation :-) J'ai corrigé mes bits de code maintenant :-) –

Répondre

11

Silverlight 3 a introduit des déclencheurs d'interaction qui, pour autant que je sache, font ce que vous voulez mais sont un peu plus complexes. Cependant, il y a très peu d'exemples à leur sujet. Si vous faites cela manuellement, vous avez besoin de références à System.Windows.Interactivity et Microsoft.Expression.Interactions (à partir de Blend 3, la classe sera dans votre onglet de références si vous l'avez installé).

Si vous ajoutez les triggers dans Blend, ils seront automatiquement ajoutés. Cela s'appelle Comportements dans Silverlight 3 et vous les trouverez dans Mélange dans la section Comportements de l'onglet Ressources.

Un exemple de la façon dont ils fonctionnent. Notez le storyboard assis dans la ressource du deuxième rectangle, je ne pouvais pas le faire fonctionner à l'intérieur du ControlStoryboardAction.Storyboard, mais cela a fonctionné si j'ai fait du rectangle ContentControl et l'ai placé dans le Template. Cela peut être un bug ou me manque quelque chose:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="SLTrigger.MainPage" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
    xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"> 
    <Grid x:Name="LayoutRoot"> 
    <StackPanel> 
     <Rectangle Margin="5" Fill="Blue" Width="200" Height="100"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <ic:ChangePropertyAction PropertyName="Fill" Duration="0"> 
         <ic:ChangePropertyAction.Value> 
          <SolidColorBrush Color="Red"/> 
         </ic:ChangePropertyAction.Value> 
        </ic:ChangePropertyAction> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Rectangle> 
     <Rectangle Margin="5" x:Name="AnimatedRectangle2" Fill="Blue" Width="200" Height="100"> 
      <Rectangle.Resources> 
       <Storyboard x:Key="AnimationStoryboard"> 
        <ColorAnimation 
         Storyboard.TargetName="AnimatedRectangle2" 
         Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
         To="Red" 
         AutoReverse="True" 
         Duration="0:0:0.5" /> 
       </Storyboard> 
      </Rectangle.Resources> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <im:ControlStoryboardAction ControlStoryboardOption="Play" Storyboard="{StaticResource AnimationStoryboard}"> 
         <!-- 
         Doesn't work, but does work inside control templates?? 
         <im:ControlStoryboardAction.Storyboard> 
          <Storyboard> 
           <ColorAnimation 
             Storyboard.TargetName="AnimatedRectangle2" 
             Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
             To="Red" 
             AutoReverse="True" 
             Duration="0:0:0.5" /> 
          </Storyboard> 
         </im:ControlStoryboardAction.Storyboard> 
         --> 
        </im:ControlStoryboardAction> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Rectangle> 
     <ContentControl> 
      <ContentControl.Template> 
       <ControlTemplate> 
        <Rectangle Margin="5" x:Name="AnimatedRectangle3" Fill="Blue" Width="200" Height="100"> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="MouseLeftButtonDown"> 
           <im:ControlStoryboardAction ControlStoryboardOption="Play"> 
            <im:ControlStoryboardAction.Storyboard> 
             <Storyboard> 
              <ColorAnimation 
                Storyboard.TargetName="AnimatedRectangle3" 
                Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
                To="Red" 
                AutoReverse="True" 
                Duration="0:0:0.5" /> 
             </Storyboard> 
            </im:ControlStoryboardAction.Storyboard> 
           </im:ControlStoryboardAction> 
          </i:EventTrigger> 
         </i:Interaction.Triggers> 
        </Rectangle> 
       </ControlTemplate> 
      </ContentControl.Template> 
     </ContentControl> 
     <TextBlock TextAlignment="Center" Text="Click the rectangles" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Le fichier de classe n'a rien de:

using System.Windows.Controls; 

namespace SLTrigger 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

super trucs. OK donc encore c'est un déclencheur d'événement, et il n'y a toujours aucun moyen pour un déclencheur de propriété? Dans ce cas, puis-je simplement déclencher un événement personnalisé dans le contrôle lorsque cette propriété change et utiliser le déclencheur d'événement basé sur "interaction" que vous avez montré ci-dessus? Cela fonctionnerait-il? D'une manière ou d'une autre, j'ai besoin de faire fonctionner le storyboard (en XAML) lorsque la valeur de la propriété dans mon contrôle change. Je ne veux pas le coder en C#. Je veux le garder en XAML tel quel maintenant. –

+0

Je sais que cette question est ancienne, mais Silverlight 4 a maintenant des déclencheurs supplémentaires, y compris une propriété qui a changé de déclencheur. –

+0

Pourquoi personne n'a jamais +1 cette réponse devant moi? –