2009-06-26 8 views
1

Je le code suivant:TranslateTransform dans le style

<Window.Resources> 
<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="LayoutTransform"> 
    <Setter.Value> 
     <TranslateTransform /> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
     <EventTrigger.Actions> 
     <BeginStoryboard> 
      <Storyboard RepeatBehavior="Forever" AutoReverse="True"> 
      <DoubleAnimation 
       From="300" 
       To="-300" 
       Storyboard.TargetProperty="LayoutTransform.X" 
       Duration="0:0:1" /> 
      </Storyboard> 
     </BeginStoryboard> 
     </EventTrigger.Actions>   
    </EventTrigger> 
    </Style.Triggers>  
</Style> 


<TextBlock 
    Grid.Column="1" 
    Text="This is a sample text."/> 

<Rectangle Grid.Column="0" Fill="AliceBlue"/> 
<Rectangle Grid.Column="2" Fill="Aquamarine"/> 

Essentiellement, ce que j'essaie de réaliser, c'est que le contenu de TextBlock devrait défiler de droite à gauche (et inversement). D'une manière ou d'une autre, ce style ne fait rien. Si je change TranslateTransform en ScaleTransform et change LayoutTransform.X en LayoutTransform.ScaleX, le TextBlock est très bien animé. Est-ce un bug dans WPF ou est-ce que je manque quelque chose?

+0

Ok, le problème est LayoutTransform (voici l'explication de MSDN): La définition d'une transformation fournit de puissantes fonctionnalités de mise à l'échelle et de rotation. Toutefois, LayoutTransform ignore les opérations TranslateTransform. Cela est dû au fait que le comportement du système de disposition pour les éléments enfants d'un objet FrameworkElement corrige automatiquement les décalages vers la position d'un élément mis à l'échelle ou pivoté dans le système de disposition et de coordonnées de l'élément parent. Modifié LayoutTransform à RenderTransform et fonctionne maintenant comme un charme. –

Répondre

0

Je ne sais pas comment je suis cela fonctionne du tout, mais je l'aurais pensé que vous auriez besoin de spécifier le TargetProperty comme X et TargetName comme _translateTransform:

<Window.Resources> 
<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="LayoutTransform"> 
    <Setter.Value> 
     <TranslateTransform x:Name="_translateTransform"/> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
     <EventTrigger.Actions> 
     <BeginStoryboard> 
      <Storyboard RepeatBehavior="Forever" AutoReverse="True"> 
      <DoubleAnimation 
       From="300" 
       To="-300" 
       Storyboard.TargetProperty="X" 
       Storyboard.TargetName="_translateTransform" 
       Duration="0:0:1" /> 
      </Storyboard> 
     </BeginStoryboard> 
     </EventTrigger.Actions>   
    </EventTrigger> 
    </Style.Triggers>  
</Style> 
+2

C'est ce que j'ai essayé en premier mais apparemment vous ne pouvez pas définir la propriété Storyboard.TargetName dans un style. –

1

J'ai eu le même problème avec RotateTransform. J'ai voulu que tous mes contrôles aient cette animation. J'ai trouvé la solution, et il semble que cela fonctionne aussi avec TrasnslteTransform.

Essayez le code suivant:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <Setter Property="RenderTransform"> 
      <Setter.Value> 
       <TranslateTransform X="0" Y="0"/> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <EventTrigger RoutedEvent="Loaded"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="(TextBox.RenderTransform).(TranslateTransform.X)" 
              From="300" 
              To="-300" 
              AutoReverse="True" 
              RepeatBehavior="Forever"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<Grid> 
    <TextBox Width="200" Height="22"/> 
</Grid> 

Je suppose que l'astuce est dans la façon dont vous spécifiez votre propriété cible. Ce code a fonctionné pour moi.

Je sais que ça fait 5 ans que la question a été posée, mais quelqu'un d'autre pourrait bénéficier de la réponse. :)