#c# #wpf #storyboard
#c# #wpf #раскадровка
Вопрос:
Должно быть что-то очень простое, но мне уже требуется десятки минут для решения. Вот почему спрашиваю.
// start animation like this
var storyboard = new Storyboard();
...
storyboard.Completed = storyboard_Completed;
storyboard.Begin(control); // << "control"
static void storyboard_Completed(object sender, EventArgs e)
{
var storyboard = sender as Storyboard;
...
// how to get "control" here?
}
Я могу использовать свойства или, возможно, создать что-то вроде Tag
для раскадровки (прикрепленное свойство?). Но это просто не может быть настолько сложным для такой очевидной задачи.
Ответ №1:
Completed
Событие наследуется от Timeline.Completed
события. Вы можете видеть, что он использует стандартный EventArgs
объект, поэтому очевидно, что ему негде хранить ссылку на любой элемент управления, который может использоваться в Animation
.
Самый простой способ получить ссылку на элемент управления, к которому вы применили свой, Animation
— это определить закрытую переменную-член в вашем классе:
private UIElement animatedContol = null;
…
// start animation like this
var storyboard = new Storyboard();
...
storyboard.Completed = storyboard_Completed;
storyboard.Begin(control);
animatedContol = control;
…
static void storyboard_Completed(object sender, EventArgs e)
{
var storyboard = sender as Storyboard;
...
// do something with animatedContol here
}
Комментарии:
1. Анимация применяется к элементу управления внутри пользовательского элемента управления. Проблема заключалась
static
в методе (нетthis
), но после вашей ссылки на элемент управления, к которому вы применили анимацию , стало очевидно: создание нестатического метода, чтобы обработчик событий тоже стал нестатическим, и я имеюthis
в своем распоряжении. Спасибо.2. И что произойдет, если вы запустите его более одного раза, не дожидаясь, с разными элементами управления в качестве параметров? мне действительно не нравится, как реализованы эти раскадровки.