1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
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
{
/// <summary>
/// Interaction logic for XAxisDoubles.xaml
/// </summary>
internal partial class XAxisDoubles : UserControl
{
/// <summary>
/// Initializes a new instance of the <see cref="XAxisDoubles"/> class.
/// </summary>
public XAxisDoubles()
{
InitializeComponent();
this.Loaded += XAxisDoubles_Loaded;
}
/// <summary>
/// Handles the Loaded event of the XAxisDoubles control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="RoutedEventArgs"/> instance containing the event data.</param>
private void XAxisDoubles_Loaded(object sender, RoutedEventArgs e)
{
DrawTicks();
}
/// <summary>
/// Gets or sets the number of ticks.
/// </summary>
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()));
/// <summary>
/// Gets or sets the minimum.
/// </summary>
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()));
/// <summary>
/// Gets or sets the maximum.
/// </summary>
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()));
/// <summary>
/// Gets or sets the string format.
/// </summary>
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));
/// <summary>
/// Draws the labels.
/// </summary>
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);
};
}
}
}
/// <summary>
/// Adds the label.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="index">The index.</param>
/// <returns></returns>
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;
}
}
}
|