public void NotifyPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) { WPFUtils.ExecuteOnUiThreadInvoke(() => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)), DispatcherPriority.Normal, propertyName); } }
public void AnimateToPoint(Point start, Point destination, Action postAction = null) { _isAnimating = true; MagnifierCircle.Visibility = Visibility.Visible; MagnifierInnerCircle.Visibility = Visibility.Visible; Task task = Task.Factory.StartNew(() => { Vector delta = destination - start; if (delta.Length <= ANIM_THRESHOLD) { WPFUtils.ExecuteOnUiThreadInvoke(() => SetPosition(destination)); } else //animate { double iterationCount = Math.Ceiling(delta.Length / ANIM_THRESHOLD); // every N points with 10 msec interval double deltaX = delta.X / iterationCount; double deltaY = delta.Y / iterationCount; for (int i = 0; i < iterationCount; i++) { Point pos1 = new Point(start.X + i * deltaX, start.Y + i * deltaY); WPFUtils.ExecuteOnUiThreadInvoke(() => SetPosition(pos1)); Thread.Sleep(20); } } _isAnimating = false; if (postAction != null) { postAction(); } }); }