using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Tango.SharedUI.Helpers; namespace Tango.Touch.Controls { [TemplatePart(Name = PART_Rectangle, Type = typeof(Rectangle))] public class TouchNavigationLinks : ListBox { private const string PART_Rectangle = "PART_Rectangle"; private Line _line; private Object _lastSelectedItem; static TouchNavigationLinks() { DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchNavigationLinks), new FrameworkPropertyMetadata(typeof(TouchNavigationLinks))); } public TouchNavigationLinks() { SelectionChanged += NavigationLinks_SelectionChanged; Loaded += (_, __) => MoveLineToSelectedItem(); } public override void OnApplyTemplate() { _line = GetTemplateChild(PART_Rectangle) as Line; } private void NavigationLinks_SelectionChanged(object sender, SelectionChangedEventArgs e) { MoveLineToSelectedItem(); } private void MoveLineToSelectedItem() { if (SelectedItem != null) { var container = ItemContainerGenerator.ContainerFromItem(SelectedItem) as FrameworkElement; ContentPresenter presenter = container.FindChild().FindChild(); if (presenter != null) { Point relativePoint = presenter.TransformToAncestor(this).Transform(new Point(0, 0)); double width = presenter.ActualWidth; if (_lastSelectedItem != null && Items.IndexOf(SelectedItem) > Items.IndexOf(_lastSelectedItem)) { DoubleAnimation aniX2 = new DoubleAnimation(); aniX2.To = relativePoint.X + width; aniX2.Duration = TimeSpan.FromSeconds(0.2); _line.BeginAnimation(Line.X2Property, aniX2); DoubleAnimation aniX1 = new DoubleAnimation(); aniX1.To = relativePoint.X; aniX1.BeginTime = TimeSpan.FromSeconds(0.2); aniX1.Duration = TimeSpan.FromSeconds(0.1); _line.BeginAnimation(Line.X1Property, aniX1); } else { DoubleAnimation aniX1 = new DoubleAnimation(); aniX1.To = relativePoint.X; aniX1.Duration = TimeSpan.FromSeconds(0.2); _line.BeginAnimation(Line.X1Property, aniX1); DoubleAnimation aniX2 = new DoubleAnimation(); aniX2.To = relativePoint.X + width; aniX2.BeginTime = TimeSpan.FromSeconds(0.2); aniX2.Duration = TimeSpan.FromSeconds(0.1); _line.BeginAnimation(Line.X2Property, aniX2); } } } _lastSelectedItem = SelectedItem; } } }