using System; 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.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Tango.Visuals.Components { /// /// Interaction logic for XAxisDoubles.xaml /// internal partial class XAxisDoubles : UserControl { /// /// Initializes a new instance of the class. /// public XAxisDoubles() { InitializeComponent(); this.Loaded += XAxisDoubles_Loaded; } /// /// Handles the Loaded event of the XAxisDoubles control. /// /// The source of the event. /// The instance containing the event data. private void XAxisDoubles_Loaded(object sender, RoutedEventArgs e) { DrawTicks(); } /// /// Gets or sets the number of ticks. /// public int Ticks { get { return (int)GetValue(TicksProperty); } set { SetValue(TicksProperty, value); } } public static readonly DependencyProperty TicksProperty = DependencyProperty.Register("Ticks", typeof(int), typeof(XAxisDoubles), new PropertyMetadata(8, (d, e) => (d as XAxisDoubles).DrawTicks())); /// /// Gets or sets the minimum. /// public double Minimum { get { return (double)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } } public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(XAxisDoubles), new PropertyMetadata(0.0, (d, e) => (d as XAxisDoubles).DrawTicks())); /// /// Gets or sets the maximum. /// public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(XAxisDoubles), new PropertyMetadata(100.0, (d, e) => (d as XAxisDoubles).DrawTicks())); /// /// Gets or sets the string format. /// public String StringFormat { get { return (String)GetValue(StringFormatProperty); } set { SetValue(StringFormatProperty, value); } } public static readonly DependencyProperty StringFormatProperty = DependencyProperty.Register("StringFormat", typeof(String), typeof(XAxisDoubles), new PropertyMetadata(null)); /// /// Draws the labels. /// private void DrawTicks() { grid.ColumnDefinitions.Clear(); grid.Children.Clear(); grid.ClipToBounds = false; var steps = Enumerable.Range(0, Ticks) .Select(i => Minimum + (Maximum - Minimum) * ((double)i / (Ticks - 1))).ToList(); for (int i = 0; i < Ticks; i++) { if (i == Ticks - 1) { var container = AddLabel(steps[i].ToString(StringFormat != null ? StringFormat : "0.0"), i); container.HorizontalAlignment = HorizontalAlignment.Right; grid.Children.Add(container); container.Loaded += (x, y) => { container.Margin = new Thickness(0, 0, (container.ActualWidth / 2) * -1, 0); }; } else { ColumnDefinition column = new ColumnDefinition(); column.Width = new GridLength(1, GridUnitType.Star); grid.ColumnDefinitions.Add(column); var container = AddLabel(steps[i].ToString(StringFormat != null ? StringFormat : "0.0"), i); grid.Children.Add(container); container.Loaded += (x, y) => { container.Margin = new Thickness((container.ActualWidth / 2) * -1, 0, 0, 0); }; } } } /// /// Adds the label. /// /// The text. /// The index. /// private ContentControl AddLabel(String text, int index) { ContentControl label = new ContentControl(); label.Content = text; label.VerticalAlignment = System.Windows.VerticalAlignment.Top; label.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; Grid.SetColumn(label, index); return label; } } }