Доброго времени суток! Вопрос следующий. Есть Grid на нем какой-нибудь контрол. Допустим Image.
<Grid x:Name="MainGrid" Background="Gray">
<Image x:Name="Img" HorizontalAlignment="Left" VerticalAlignment="Top" Source="Resources/1.png" Width="100" Margin="0,0,0,0" />
</Grid>
Предположим Image должен перемещаться вслед за мышью. Не знаю насколько это правильно, но я обрабатываю событие Window.MouseMove и меняю Margin.
private void Window_MouseMove(object sender, MouseEventArgs e)
{
Point MousePos = new Point();
MousePos = e.GetPosition(MainGrid);
Thickness Pos = new Thickness();
Pos.Left = MousePos.X;
Pos.Top = MousePos.Y;
Img.Margin = Pos;
}
Запускаем проверяем все вроде ок... НО как только я начинаю использовать анимацию к примеру так:
private void Window_KeyDown(object sender, KeyEventArgs e)
{
// Анимация margin
ThicknessAnimation ta = new ThicknessAnimation();
Thickness topMargin = new Thickness(10, 10, 0, 0);
ta.To = topMargin;
ta.From = Img.Margin;
ta.Duration = TimeSpan.FromSeconds(2);
Img.BeginAnimation(FrameworkElement.MarginProperty, ta);
}
все ломается. Margin я менять больше не могу, соответственно за мышью он не перемещается (У меня есть смутные сомнения что анимация видимо работает как отдельный поток, где-то делает Lock... надеюсь это не звучит как ахинея. Тогда почему он не освобождается в конце анимации? может ее как-то надо завершить?).
Вся эта история в точности повторяется для Button, Ellipse и StackPanel. Вероятно и для любого наследника UIElement будет то же самое. Ожидаемо все это происходит и c другими свойствами (DependencyProperty??) типа WidthProperty и т.п.
- Вопрос 1. Как вообще правильно двигать элементы (только без xaml - допустим динамически создаю элементы в отделенном коде)? Мой ход конем с Margin меня как-то внутренне напрягает. Как это вообще "принято" делать?
- Вопрос 2. Почему же все-таки Margin не меняется после анимации, и как это исправить?

Img.BeginAnimation(FrameworkElement.MarginProperty, null);. 2) Можно, но это уже отдельный вопрос. – VladD Nov 16 '17 at 16:08