2014-11-08 1 views
0

HubPage - моя целевая страница. На Hubpage.xaml у меня есть сетка 3x3, содержащая Rectangle, что я называю «ячейкой». В, HubPage.xaml.cs частности в HubPage() конструктор, создать раскадровку для каждой ячейки:Как добавить анимацию раскадровки в ресурсы страницы на C#, а затем вызвать ее позже?

CreateStoryboardForCell("Column0Row0"); 
CreateStoryboardForCell("Column0Row1"); 
... 
CreateStoryboardForCell("Column2Row2"); 

Хочу добавить раскадровку к Page.Resources обычно я хотел бы сделать это в XAML, но я пытаюсь это сделать с C#. Теперь, здесь реализация CreateStoryboardForCell:

private void CreateStoryboardForCell(string cellName) 
    { 
     // Create two DoubleAnimations, one for scaleX and one for scaleY, and set their properties. 
     Duration duration = new Duration(TimeSpan.FromSeconds(0.2)); 
     DoubleAnimation myDoubleAnimation1 = new DoubleAnimation(); 
     DoubleAnimation myDoubleAnimation2 = new DoubleAnimation(); 
     myDoubleAnimation1.Duration = duration; 
     myDoubleAnimation2.Duration = duration; 

     Storyboard sb = new Storyboard(); 
     sb.Duration = duration; 

     sb.Children.Add(myDoubleAnimation1); 
     sb.Children.Add(myDoubleAnimation2); 

     // Set the targets of the animations 
     Storyboard.SetTarget(myDoubleAnimation1, Column0Row0); 
     Storyboard.SetTarget(myDoubleAnimation2, Column0Row0); 

     // Set the attached properties of ScaleX and ScaleY 
     // to be the target properties of the two respective DoubleAnimations 
     Storyboard.SetTargetProperty(myDoubleAnimation1, "(UIElement.RenderTransform).(CompositeTransform.ScaleX)"); 
     Storyboard.SetTargetProperty(myDoubleAnimation2, "(UIElement.RenderTransform).(CompositeTransform.ScaleY)"); 
     myDoubleAnimation1.To = 15; 
     myDoubleAnimation2.To = 22; 

     // Make the Storyboard a resource. 
     try 
     { 
      pageRoot.Resources.Add("story" + cellName, sb); 
     } 
     catch (Exception e) 
     { 
      Status.Text = "Error adding storyboard resource for cell" + cellName + ": " + e.Message; 
     } 
    } 

pageRoot от Hubpage.xaml: Page х: Name = «pageRoot» и т.д. Я не получаю исключение при добавлении ресурса, но я не могу видеть ресурс когда я устанавливаю точку останова, поэтому я предполагаю, что она была добавлена ​​успешно, поскольку я могу видеть увеличение счетчика, и никаких исключений не было.

Перемещение, у меня есть обработчик клика для каждой ячейки столбца, где я делаю вывод номера строки и столбца и пытаюсь запустить соответствующую раскадровку, добавленную ранее на ресурс страницы. Вот код:

private void Column1_Cell_Click(object sender, RoutedEventArgs e) 
    { 

     Rectangle rect = sender as Rectangle; 
     int x = (int)rect.GetValue(Grid.RowProperty); 
     int y = (int)rect.GetValue(Grid.ColumnProperty); 
     string storyboardName = "storyColumn" + y + "Row" + x; 
     Storyboard storyboard = (Storyboard)FindName(storyboardName); 

     storyboard.Begin(); 
    } 

но вызов FindName всегда возвращает нужный раскадровки. Что мне здесь не хватает?

ответ

1

Я написал этот код для you.I надеюсь выгоды для бизнеса

Вот код:

<Grid>  
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="Column0Row0"/> 
     <ColumnDefinition x:Name="Column0Row1"/> 
     <ColumnDefinition x:Name="Column0Row2"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Rectangle Fill="Pink" x:Name="rectangle" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/> 
    <Rectangle Grid.Column="1" Grid.Row="1" Fill="Coral" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/> 
    <Rectangle Grid.Column="2" Grid.Row="2" Fill="Orange" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/> 
</Grid> 

Код За:

private void CreateStoryboardForCell(Rectangle target) 
    { 
     ScaleTransform trans = new ScaleTransform(); 
     target.RenderTransform = trans; 
     DoubleAnimation anim = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000)); 
     trans.BeginAnimation(ScaleTransform.ScaleXProperty, anim); 
     trans.BeginAnimation(ScaleTransform.ScaleYProperty, anim); 

    } 

    private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     CreateStoryboardForCell((Rectangle)sender);    
    }  
+1

Если у вас есть другие проблемы. Я пытаюсь помочь – MLElyakan

+0

Ошибка, которую я получаю, это «Windows.UI.Xaml.Media.ScaleTransform 'не содержит определения для «BeginAnimation» и не может быть найден метод расширения «BeginAnimation», принимающий первый аргумент типа «Windows.UI.Xaml.Media.ScaleTransform» (вам не хватает директивы использования или ссылки на сборку?). Я думаю, что это WPF, и мне нужно приложение Windows Store. – Freakishly

+0

BeginAnimation не работает для меня, но вы задали мне правильный путь, поэтому я отмечаю это как ответ. То, что я делал неправильно: сохранение другого StoryBoard для каждой цели в App.Current.Resources, а затем поиск по каждому целевому (Rectangle) клику. Вместо этого я перехватываю щелчок, создаю StoryBoard на лету, и он работает как шарм :) – Freakishly

1

Пожалуйста, попробуйте этот код. Я всегда использую этот код для поиска раскадровки. Он работает.

Вот код:

FrameworkElement element = new FrameworkElement(); 
Storyboard sb=new Storyboard(); 
sb = element.FindResource("Please write here Storyboard Key") as Storyboard; 
sb.Begin(target element name , true); 
+0

«Целевое имя элемента» это имя, что вы хотите применить объект анимировать. Например, объект Ellipse. x: Name = "эллипс". Эллипс - это имя целевого элемента. (Извините, я не очень хорошо знаю английский. Я надеюсь, что у вас это получилось) – MLElyakan

+0

Спасибо за вашу помощь. Я пробовал ваш подход, но, похоже, FindResource недоступен в WinRT. – Freakishly

+0

Если ваш стиль определен в Ресурсах App.xaml, вы можете использовать этот код var animation = Application.Current.Resources ["ShowVideoCallPanel"] как Storyboard; – MLElyakan

0

If BeginStor yboard не поддерживается в WinRT. Вы можете использовать следующий код. Я создал анимацию в кодированном коде. Может быть, вы можете решить такую ​​проблему, я сделал некоторое исследование этой проблемы. Я попробовал это code.It работает

Вот код:

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Storyboard storyboard = new Storyboard(); 

     ScaleTransform scale = new ScaleTransform(1.0, 1.0); 
     animatedRectangle.RenderTransformOrigin = new Point(0.5, 0.5); 
     animatedRectangle.RenderTransform = scale; 

     DoubleAnimation scaleAnimation1 = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000)); 
     DoubleAnimation scaleAnimation2 = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000)); 
     storyboard.Children.Add(scaleAnimation1); 
     storyboard.Children.Add(scaleAnimation2); 

     Storyboard.SetTargetProperty(scaleAnimation1, new PropertyPath("RenderTransform.ScaleX")); 
     Storyboard.SetTargetProperty(scaleAnimation2, new PropertyPath("RenderTransform.ScaleY")); 


     Storyboard.SetTarget(scaleAnimation1, animatedRectangle); 
     Storyboard.SetTarget(scaleAnimation2, animatedRectangle); 

     storyboard.Begin();   

    }   
+0

Пожалуйста, посмотрите этот веб-сайт http://irisclasson.com/2012/06/28/creating-a-scaletransform- В этом веб-сайте есть код CompositeTransform.CompositeTransform, используемый в winrt-приложениях. Я пробовал этот код в приложении Wpf, но не работал. Поскольку Composite transform не поддерживается в Wpf. – MLElyakan

+0

Пожалуйста, попробуйте приведенный выше код. Если он не работает. Вы можете посмотреть здесь «http://irisclasson.com/2012/06/28/creating-a-scaletransform-animation-in-c-for-winrt -metro-apps/«Успокойся :) – MLElyakan

Смежные вопросы