5

jestem aprowizacji z niektórych storyboardy w aplikacji Metro XAML. Muszę utworzyć kod Storyboard. Chciałbym ustawić Storyboard.TargetProperty do CompositeTransform.RotationNie można ustawić Storyboard.TargetProperty do CompositeTransform.Rotation w stylu Metro aplikacji z kodu

Wydaje się niemożliwe ...

Moje Storyboard w XAML wygląda następująco:

<Storyboard> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="grid"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="60"/ 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

Chciałbym stworzyć coś podobnego.
Ważne: ja nie próbuję RECReate dokładnie ten Storyboard. Jestem wewnątrz kodu niestandardowego ContentControl, więc this jest Control, a nie ma „grid” do celu animację. Celem jest sama kontrola, która wcześniej została ustawiona.

Mój kod do tej pory jest tak:

var turnSB = new Storyboard(); 

var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = currentAngle }); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = targetAngle }); 

turnSB.Children.Add(doubleAnim); 

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

turnSB.Begin(); 

Jak tylko trafi metodę Rozpocznij uzyskać wyjątek mówiący, że (CompositeTransform.Rotation) nie może zostać rozwiązany. Zgaduję, że ścieżka własności nie była całkiem właściwa. Próbowałem różnych odmian, ale zgodnie z PropertyPaths, to powinno być prawidłowe, czyż nie? : S

Jeśli jest to nierozwiązywalny problem, jestem otwarty na sugestie na obejście ...

EDIT:

myślę, że rozwiązali problem teraz. Mam kilka ciekawych wniosków chociaż ...

Jeśli zrobię UserControl można zrobić praktycznie wszystko. Wszystko działa, mogę ustawić Storyboard.Targetproperty, a animacja jest odtwarzana poprawnie.

Jeśli jednak używam kontrolki niestandardowej lub dziedziczę z innej kontrolki (np. ContentControl), nie mogę uruchomić Scenariusza z kodu, tylko w niektórych przypadkach.

Na przykład: jeśli robię storyboard (zdefiniowane w XAML) animowanie obrotu (lub dowolną właściwość transformacji dla tej sprawy) i spróbuj uruchomić z kodu, otrzymuję powyższy wyjątek. Ale jeśli animuję prostą właściwość, powiedzmy Opacity, działa dobrze.
(Zrobiłem to samo z UserControl i zadziałało.)

Czy ktoś może to wyjaśnić?

+0

Mam ten sam problem, posiadające klasy dziedziczą z Grid Control, storyboardy prostu wygrał” t start. –

+0

Należy zwrócić uwagę na to, że siatka nie jest dziedziczona po kontroli, więc nie jest to naprawdę niestandardowy formant, który tworzysz. –

+0

Nie korzystałem z Grid, dziedziczyłem z ContentControl. Xaml pochodzi z poprzedniej próby, gdzie miałem kontrolkę UserControl, która miała w sobie Grid, i to było celem animacji. Ale jeśli chodzi o tę sytuację, celem powinna być sama kontrola. Które - jeśli przeczytałeś uważnie - opisałem w sekcji "Ważne". – Tenshiko

Odpowiedz

4

Z MSDN docs wygląda jak trzeba ustawić całą ścieżkę napisów. Więc dla animacji opisaną w XAML, trzeba by ustawić TargetProperty jako taki

Storyboard.SetTargetProperty(doubleAnim, "(UIElement.RenderTransform).(CompositeTransform.Rotation)"); 

UPDATE: Znaleźliśmy ten blog post który dodaje osi czasu jako dziecko serii ujęć. Spróbuj wykonać następujące czynności:

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "Rotation"); // maybe "CompositeTransform.Rotation" 
storyboard.Children.Add(doubleAnim); 
+0

Próbowałem każdej kombinacji tych. Wyniki były zawsze takie same. – Tenshiko

+0

Doszedłem do wniosku, że problem nie dotyczy ustawienia Storyboard. W rzeczywistości twoja pierwsza sugestia działa teraz, ale tylko z UserControls. Chciałbym dowiedzieć się więcej na ten temat, może ktoś może rzucić trochę światła na ten temat. Ale jeśli nie, przyjmuję twoją odpowiedź. Thx :) – Tenshiko

+0

Więc to jest w niestandardowej kontroli? –

4

Myślę, że powodem, że ten błąd jest, bo nie instancję właściwość formantu niestandardowego RenderTransform.

public class CustomControl2 : Control 
{ 
    public CustomControl2() 
    { 
     this.DefaultStyleKey = typeof(CustomControl2); 
    } 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
    } 

    public void RunAnimation() 
    { 
     //this.RenderTransform = new CompositeTransform(); 
     this.Background = new SolidColorBrush(Color.FromArgb(0xFF, 0x33, 0xC8, 0x9C)); 

     var turnSB = new Storyboard(); 

     var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 10 }); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = 30 }); 

     turnSB.Children.Add(doubleAnim); 

     Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
     Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

     turnSB.Begin(); 
    } 
} 

Uwaga: W powyższym kodzie, jeśli mogę wypowiedzieć się na pierwszą linię metodą RunAnimation będzie rzucać mi ten sam błąd otrzymujesz.

Następnie utworzyłem tę kontrolkę na mojej stronie głównej, a także utworzyłem Button, aby uruchomić animację.

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    this.MyControl.RunAnimation(); 
} 

Testowałem powyższy kod i działało dobrze.

+0

Rozumiem, dlaczego to powinno działać, ale jak już powiedziałem w swoim oryginalnym wpisie, ZOSTAŁEM skonfigurowany Transformacja (proszę ponownie przeczytać sekcję "Ważne"). Co więcej, udało mi się odtworzyć ten sam efekt za pomocą prostszego rozwiązania. Pozwól mi sprawdzić to jeszcze raz, a następnie wrócę do ciebie. – Tenshiko

+0

Jedną rzeczą, o której mogę myśleć jest to, że możesz uruchomić anmiację przed wywołaniem 'OnApplyTemplate'? –

1

rozwiązany

Problemem jest na drodze do elementu jesteś używanego jej musi pochodzić z grupy macierzystej jego rozszerzającej na posesji. Mam to działa w moim kontroli tak wykonany mały przykład można skopiować pasty (NIETESTOWANY kod):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Media.Animation; 

namespace CustomControls 
{ 
    /// <summary> 
    /// Author: Frank Wolferink 
    /// Note: example is untested and comes as is. I hope it save's you the time i lost figering this out 
    /// </summary> 
    public class CustomControl : Control 
    { 

     private Storyboard _compositeTransformExampleStoryBoard; 

     private const string TRANSLATE_X_TARGET = "Control.RenderTransform.CompositeTransform.TranslateX"; 
     private const string TRANSLATE_Y_TARGET = "Control.RenderTransform.CompositeTransform.TranslateY"; 
     private const string TRANSLATE_ROTATE_TARGET = "Control.RenderTransform.CompositeTransform.Rotation"; 


     public CustomControl() 
     { 
      this.RenderTransform = new CompositeTransform(); 

      TimeSpan duration = new TimeSpan(0,0,0,0,500); 
      double translateX = 10; 
      double translateY = 10; 
      double rotation = 40; 

      _compositeTransformExampleStoryBoard = BuildStoryboard(duration, translateX, translateY, rotation); 

      this.Loaded += CustomControl_Loaded; 
     } 

     void CustomControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      _compositeTransformExampleStoryBoard.Begin(); 
     } 


     private Storyboard BuildStoryboard(TimeSpan animationDuration, double transistionValueX, double transistionValueY, double rotation) 
     { 
      Storyboard storyboard = new Storyboard(); 

      if (transistionValueX != 0) 
       CreateAnimation(storyboard, transistionValueX, animationDuration, TRANSLATE_X_TARGET); 

      if (transistionValueY != 0) 
       CreateAnimation(storyboard, transistionValueY, animationDuration, TRANSLATE_Y_TARGET); 

      if (rotation != 0) 
       CreateAnimation(storyboard, rotation, animationDuration, TRANSLATE_ROTATE_TARGET); 


      return storyboard; 
     } 

     private void CreateAnimation(Storyboard storyboard, double transistionValue, TimeSpan animationDuration, string targetProperty) 
     { 
      DoubleAnimation da = CreateDoubleAnimation(transistionValue, animationDuration); 
      storyboard.Children.Add(da); 
      Storyboard.SetTarget(da, this); 
      Storyboard.SetTargetProperty(da, targetProperty); 
     } 

     private DoubleAnimation CreateDoubleAnimation(double transistionValue, TimeSpan duration) 
     { 
      return new DoubleAnimation() 
      { 
       Duration = duration, 
       To = transistionValue 
      }; 
     } 

    } 
} 

Powiązane problemy