Я пока не очень хорошо знаком с большим количеством WPF, поэтому, если этот запрос выдает какие-то явные недоразумения, я был бы признателен за их указание.
Что я пытаюсь сделать (навсегда илиплохо) - это синхронизация DoubleAnimation.FromProperty
с фактической шириной StackPanel, содержащей / запускающей анимацию.
Первоначально я пытался сделать это с привязкой данных, например,
BindingOperations.SetBinding(anim,
DoubleAnimation.FromProperty,
new Binding {Source = panel, Path = new PropertyPath(ActualWidthProperty)});
Но это не такКажется, не работает.Хотя я могу привязать текстовое поле к свойству From и увидеть, что оно меняется, анимация продолжает выполняться с начального значения.Это как-то связано с зависанием раскадровки?(о котором я ничего не знаю, но только что слышал)
Тогда я подумал, почему бы не остановить и не перезапустить раскадровку (выключить и снова включить!), изменив тем самым FromProperty, обработав StackPanel.SizeChanged
событие.Примерно так:
void panel_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (myStoryBoard != null && myStoryBoard.GetCurrentState(panel) == ClockState.Active)
{
myStoryBoard.Stop(panel);
foreach(var child in myStoryBoard.Children)
{
var anim = child as DoubleAnimation;
if (anim == null) continue;
anim.From = panel.ActualWidth;
}
myStoryBoard.Begin(panel, true);
}
}
Это работает, но, конечно, анимация запускается с нуля при каждом изменении размера панели.Я предпочел бы возобновить анимацию с того места, где она была прервана, но с новым FromProperty.Это вообще возможно?