PieSeries.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. // --------------------------------------------------------------------------------------------------------------------
  2. // <copyright file="LineSeries.cs" company="OxyPlot">
  3. // Copyright (c) 2014 OxyPlot contributors
  4. // </copyright>
  5. // <summary>
  6. // This is a Avalonia wrapper of OxyPlot.LineSeries
  7. // </summary>
  8. // --------------------------------------------------------------------------------------------------------------------
  9. using Avalonia;
  10. namespace OxyPlot.Avalonia
  11. {
  12. using global::Avalonia.Media;
  13. /// <summary>
  14. /// This is a wrapper of OxyPlot.PieSeries.
  15. /// </summary>
  16. public class PieSeries : ItemsSeries
  17. {
  18. /// <summary>
  19. /// Identifies the <see cref="Stroke"/> dependency property.
  20. /// </summary>
  21. public static readonly StyledProperty<Color> StrokeProperty = AvaloniaProperty.Register<PieSeries, Color>(nameof(Stroke), Colors.White);
  22. /// <summary>
  23. /// Identifies the <see cref="StrokeThickness"/> dependency property.
  24. /// </summary>
  25. public static readonly StyledProperty<double> StrokeThicknessProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(StrokeThickness), 1.0);
  26. /// <summary>
  27. /// Identifies the <see cref="Diameter"/> dependency property.
  28. /// </summary>
  29. public static readonly StyledProperty<double> DiameterProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(Diameter), 1.0);
  30. /// <summary>
  31. /// Identifies the <see cref="InnerDiameter"/> dependency property.
  32. /// </summary>
  33. public static readonly StyledProperty<double> InnerDiameterProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(InnerDiameter), 0.0);
  34. /// <summary>
  35. /// Identifies the <see cref="StartAngle"/> dependency property.
  36. /// </summary>
  37. public static readonly StyledProperty<double> StartAngleProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(StartAngle), 0.0);
  38. /// <summary>
  39. /// Identifies the <see cref="AngleSpan"/> dependency property.
  40. /// </summary>
  41. public static readonly StyledProperty<double> AngleSpanProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(AngleSpan), 360.0);
  42. /// <summary>
  43. /// Identifies the <see cref="AngleIncrement"/> dependency property.
  44. /// </summary>
  45. public static readonly StyledProperty<double> AngleIncrementProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(AngleIncrement), 1.0);
  46. /// <summary>
  47. /// Identifies the <see cref="LegendFormat"/> dependency property.
  48. /// </summary>
  49. public static readonly StyledProperty<string> LegendFormatProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(LegendFormat), null);
  50. /// <summary>
  51. /// Identifies the <see cref="OutsideLabelFormat"/> dependency property.
  52. /// </summary>
  53. public static readonly StyledProperty<string> OutsideLabelFormatProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(OutsideLabelFormat), "{2:0} %");
  54. /// <summary>
  55. /// Identifies the <see cref="InsideLabelColor"/> dependency property.
  56. /// </summary>
  57. public static readonly StyledProperty<Color> InsideLabelColorProperty = AvaloniaProperty.Register<PieSeries, Color>(nameof(InsideLabelColor), MoreColors.Automatic);
  58. /// <summary>
  59. /// Identifies the <see cref="InsideLabelFormat"/> dependency property.
  60. /// </summary>
  61. public static readonly StyledProperty<string> InsideLabelFormatProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(InsideLabelFormat), "{1}");
  62. /// <summary>
  63. /// Identifies the <see cref="InsideLabelPosition"/> dependency property.
  64. /// </summary>
  65. public static readonly StyledProperty<double> InsideLabelPositionProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(InsideLabelPosition), 0.5);
  66. /// <summary>
  67. /// Identifies the <see cref="AreInsideLabelsAngled"/> dependency property.
  68. /// </summary>
  69. public static readonly StyledProperty<bool> AreInsideLabelsAngledProperty = AvaloniaProperty.Register<PieSeries, bool>(nameof(AreInsideLabelsAngled), false);
  70. /// <summary>
  71. /// Identifies the <see cref="TickDistance"/> dependency property.
  72. /// </summary>
  73. public static readonly StyledProperty<double> TickDistanceProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(TickDistance), 0.0);
  74. /// <summary>
  75. /// Identifies the <see cref="TickRadialLength"/> dependency property.
  76. /// </summary>
  77. public static readonly StyledProperty<double> TickRadialLengthProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(TickRadialLength), 6.0);
  78. /// <summary>
  79. /// Identifies the <see cref="TickHorizontalLength"/> dependency property.
  80. /// </summary>
  81. public static readonly StyledProperty<double> TickHorizontalLengthProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(TickHorizontalLength), 8.0);
  82. /// <summary>
  83. /// Identifies the <see cref="TickLabelDistance"/> dependency property.
  84. /// </summary>
  85. public static readonly StyledProperty<double> TickLabelDistanceProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(TickLabelDistance), 4.0);
  86. /// <summary>
  87. /// Identifies the <see cref="ExplodedDistance"/> dependency property.
  88. /// </summary>
  89. public static readonly StyledProperty<double> ExplodedDistanceProperty = AvaloniaProperty.Register<PieSeries, double>(nameof(ExplodedDistance), 0.0);
  90. /// <summary>
  91. /// Identifies the <see cref="LabelField"/> dependency property.
  92. /// </summary>
  93. public static readonly StyledProperty<string> LabelFieldProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(LabelField), null);
  94. /// <summary>
  95. /// Identifies the <see cref="ValueField"/> dependency property.
  96. /// </summary>
  97. public static readonly StyledProperty<string> ValueFieldProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(ValueField), null);
  98. /// <summary>
  99. /// Identifies the <see cref="ColorField"/> dependency property.
  100. /// </summary>
  101. public static readonly StyledProperty<string> ColorFieldProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(ColorField), null);
  102. /// <summary>
  103. /// Identifies the <see cref="IsExplodedField"/> dependency property.
  104. /// </summary>
  105. public static readonly StyledProperty<string> IsExplodedFieldProperty = AvaloniaProperty.Register<PieSeries, string>(nameof(IsExplodedField), null);
  106. /// <summary>
  107. /// Initializes static members of the <see cref="PieSeries"/> class.
  108. /// </summary>
  109. static PieSeries()
  110. {
  111. TrackerFormatStringProperty
  112. .OverrideMetadata(
  113. typeof(PieSeries),
  114. new StyledPropertyMetadata<string>(OxyPlot.Series.PieSeries.DefaultTrackerFormatString));
  115. StrokeProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  116. StrokeThicknessProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  117. DiameterProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  118. InnerDiameterProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  119. StartAngleProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  120. AngleSpanProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  121. AngleIncrementProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  122. LegendFormatProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  123. OutsideLabelFormatProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  124. InsideLabelColorProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  125. InsideLabelFormatProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  126. InsideLabelPositionProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  127. AreInsideLabelsAngledProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  128. TickDistanceProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  129. TickRadialLengthProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  130. TickHorizontalLengthProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  131. TickLabelDistanceProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  132. LabelFieldProperty.Changed.AddClassHandler<PieSeries>(DataChanged);
  133. ValueFieldProperty.Changed.AddClassHandler<PieSeries>(DataChanged);
  134. ColorFieldProperty.Changed.AddClassHandler<PieSeries>(DataChanged);
  135. IsExplodedFieldProperty.Changed.AddClassHandler<PieSeries>(DataChanged);
  136. TrackerFormatStringProperty.Changed.AddClassHandler<PieSeries>(AppearanceChanged);
  137. }
  138. /// <summary>
  139. /// Initializes a new instance of the <see cref="PieSeries"/> class.
  140. /// </summary>
  141. public PieSeries()
  142. {
  143. InternalSeries = new OxyPlot.Series.PieSeries();
  144. }
  145. /// <summary>
  146. /// Creates the underlying model.
  147. /// </summary>
  148. /// <returns>A series.</returns>
  149. public override OxyPlot.Series.Series CreateModel()
  150. {
  151. SynchronizeProperties(InternalSeries);
  152. return InternalSeries;
  153. }
  154. /// <summary>
  155. /// Gets or sets the stroke color.
  156. /// </summary>
  157. public Color Stroke
  158. {
  159. get { return GetValue(StrokeProperty); }
  160. set { SetValue(StrokeProperty, value); }
  161. }
  162. /// <summary>
  163. /// Gets or sets the stroke thickness.
  164. /// </summary>
  165. public double StrokeThickness
  166. {
  167. get { return GetValue(StrokeThicknessProperty); }
  168. set { SetValue(StrokeThicknessProperty, value); }
  169. }
  170. /// <summary>
  171. /// Gets or sets the diameter.
  172. /// </summary>
  173. public double Diameter
  174. {
  175. get { return GetValue(DiameterProperty); }
  176. set { SetValue(DiameterProperty, value); }
  177. }
  178. /// <summary>
  179. /// Gets or sets the inner diameter.
  180. /// </summary>
  181. public double InnerDiameter
  182. {
  183. get { return GetValue(InnerDiameterProperty); }
  184. set { SetValue(InnerDiameterProperty, value); }
  185. }
  186. /// <summary>
  187. /// Gets or sets the start angle.
  188. /// </summary>
  189. public double StartAngle
  190. {
  191. get { return GetValue(StartAngleProperty); }
  192. set { SetValue(StartAngleProperty, value); }
  193. }
  194. /// <summary>
  195. /// Gets or sets the angle span.
  196. /// </summary>
  197. public double AngleSpan
  198. {
  199. get { return GetValue(AngleSpanProperty); }
  200. set { SetValue(AngleSpanProperty, value); }
  201. }
  202. /// <summary>
  203. /// Gets or sets the angle increment.
  204. /// </summary>
  205. public double AngleIncrement
  206. {
  207. get { return GetValue(AngleIncrementProperty); }
  208. set { SetValue(AngleIncrementProperty, value); }
  209. }
  210. /// <summary>
  211. /// Gets or sets the legend format.
  212. /// </summary>
  213. public string LegendFormat
  214. {
  215. get { return GetValue(LegendFormatProperty); }
  216. set { SetValue(LegendFormatProperty, value); }
  217. }
  218. /// <summary>
  219. /// Gets or sets the outside label format.
  220. /// </summary>
  221. public string OutsideLabelFormat
  222. {
  223. get { return GetValue(OutsideLabelFormatProperty); }
  224. set { SetValue(OutsideLabelFormatProperty, value); }
  225. }
  226. /// <summary>
  227. /// Gets or sets the color of the inside labels.
  228. /// </summary>
  229. public Color InsideLabelColor
  230. {
  231. get { return GetValue(InsideLabelColorProperty); }
  232. set { SetValue(InsideLabelColorProperty, value); }
  233. }
  234. /// <summary>
  235. /// Gets or sets the inside label format.
  236. /// </summary>
  237. public string InsideLabelFormat
  238. {
  239. get { return GetValue(InsideLabelFormatProperty); }
  240. set { SetValue(InsideLabelFormatProperty, value); }
  241. }
  242. /// <summary>
  243. /// Gets or sets the inside label position.
  244. /// </summary>
  245. public double InsideLabelPosition
  246. {
  247. get { return GetValue(InsideLabelPositionProperty); }
  248. set { SetValue(InsideLabelPositionProperty, value); }
  249. }
  250. /// <summary>
  251. /// Gets or sets a value indicating whether inside labels are angled.
  252. /// </summary>
  253. public bool AreInsideLabelsAngled
  254. {
  255. get { return GetValue(AreInsideLabelsAngledProperty); }
  256. set { SetValue(AreInsideLabelsAngledProperty, value); }
  257. }
  258. /// <summary>
  259. /// Gets or sets the distance from the edge of the pie slice to the tick line.
  260. /// </summary>
  261. public double TickDistance
  262. {
  263. get { return GetValue(TickDistanceProperty); }
  264. set { SetValue(TickDistanceProperty, value); }
  265. }
  266. /// <summary>
  267. /// Gets or sets the length of the radial part of the tick line.
  268. /// </summary>
  269. public double TickRadialLength
  270. {
  271. get { return GetValue(TickRadialLengthProperty); }
  272. set { SetValue(TickRadialLengthProperty, value); }
  273. }
  274. /// <summary>
  275. /// Gets or sets the length of the horizontal part of the tick.
  276. /// </summary>
  277. public double TickHorizontalLength
  278. {
  279. get { return GetValue(TickHorizontalLengthProperty); }
  280. set { SetValue(TickHorizontalLengthProperty, value); }
  281. }
  282. /// <summary>
  283. /// Gets or sets the distance from the tick line to the outside label.
  284. /// </summary>
  285. public double TickLabelDistance
  286. {
  287. get { return GetValue(TickLabelDistanceProperty); }
  288. set { SetValue(TickLabelDistanceProperty, value); }
  289. }
  290. /// <summary>
  291. /// Gets or sets the exploded distance.
  292. /// </summary>
  293. public double ExplodedDistance
  294. {
  295. get { return GetValue(ExplodedDistanceProperty); }
  296. set { SetValue(ExplodedDistanceProperty, value); }
  297. }
  298. /// <summary>
  299. /// Gets or sets the name of the property containing the label.
  300. /// </summary>
  301. public string LabelField
  302. {
  303. get { return GetValue(LabelFieldProperty); }
  304. set { SetValue(LabelFieldProperty, value); }
  305. }
  306. /// <summary>
  307. /// Gets or sets the name of the property containing the value.
  308. /// </summary>
  309. public string ValueField
  310. {
  311. get { return GetValue(ValueFieldProperty); }
  312. set { SetValue(ValueFieldProperty, value); }
  313. }
  314. /// <summary>
  315. /// Gets or sets the name of the property containing the color.
  316. /// </summary>
  317. public string ColorField
  318. {
  319. get { return GetValue(ColorFieldProperty); }
  320. set { SetValue(ColorFieldProperty, value); }
  321. }
  322. /// <summary>
  323. /// Gets or sets the name of the property indicating whether the item
  324. /// is exploded.
  325. /// </summary>
  326. public string IsExplodedField
  327. {
  328. get { return GetValue(IsExplodedFieldProperty); }
  329. set { SetValue(IsExplodedFieldProperty, value); }
  330. }
  331. /// <summary>
  332. /// Synchronizes the properties of this object with the underlying series object.
  333. /// </summary>
  334. /// <param name="series">The series.</param>
  335. protected override void SynchronizeProperties(OxyPlot.Series.Series series)
  336. {
  337. base.SynchronizeProperties(series);
  338. var s = (OxyPlot.Series.PieSeries)series;
  339. s.Stroke = Stroke.ToOxyColor();
  340. s.StrokeThickness = StrokeThickness;
  341. s.Diameter = Diameter;
  342. s.InnerDiameter = InnerDiameter;
  343. s.StartAngle = StartAngle;
  344. s.AngleSpan = AngleSpan;
  345. s.AngleIncrement = AngleIncrement;
  346. s.LegendFormat = LegendFormat;
  347. s.OutsideLabelFormat = OutsideLabelFormat;
  348. s.InsideLabelColor = InsideLabelColor.ToOxyColor();
  349. s.InsideLabelFormat = InsideLabelFormat;
  350. s.InsideLabelPosition = InsideLabelPosition;
  351. s.AreInsideLabelsAngled = AreInsideLabelsAngled;
  352. s.TickDistance = TickDistance;
  353. s.TickRadialLength = TickRadialLength;
  354. s.TickHorizontalLength = TickHorizontalLength;
  355. s.TickLabelDistance = TickLabelDistance;
  356. s.ExplodedDistance = ExplodedDistance;
  357. s.LabelField = LabelField;
  358. s.ValueField = ValueField;
  359. s.ColorField = ColorField;
  360. s.IsExplodedField = IsExplodedField;
  361. }
  362. }
  363. }