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; public int LineThickness { get { return (int)GetValue(LineThicknessProperty); } set { SetValue(LineThicknessProperty, value); } } // Using a DependencyProperty as the backing store for LineThickness. This enables animation, styling, binding, etc... public static readonly DependencyProperty LineThicknessProperty = DependencyProperty.Register("LineThickness", typeof(int), typeof(TouchNavigationLinks), new PropertyMetadata(3)); 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 ) { if(SelectedItem is UIElement && ((UIElement)SelectedItem).IsEnabled == false) return; 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 offset = this.Padding.Left ; double width = presenter.ActualWidth; if (_lastSelectedItem != null && Items.IndexOf(SelectedItem) > Items.IndexOf(_lastSelectedItem)) { DoubleAnimation aniX2 = new DoubleAnimation(); aniX2.To = relativePoint.X + width - offset; aniX2.Duration = TimeSpan.FromSeconds(0.2); _line.BeginAnimation(Line.X2Property, aniX2); DoubleAnimation aniX1 = new DoubleAnimation(); aniX1.To = relativePoint.X - offset; 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 - offset; aniX1.Duration = TimeSpan.FromSeconds(0.2); _line.BeginAnimation(Line.X1Property, aniX1); DoubleAnimation aniX2 = new DoubleAnimation(); aniX2.To = relativePoint.X + width - offset; aniX2.BeginTime = TimeSpan.FromSeconds(0.2); aniX2.Duration = TimeSpan.FromSeconds(0.1); _line.BeginAnimation(Line.X2Property, aniX2); } } _lastSelectedItem = SelectedItem; } _lastSelectedItem = SelectedItem; } } }