diff --git a/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln b/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln
index ffc559c3..aa629841 100644
--- a/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln
+++ b/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln
@@ -7,9 +7,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended.Samples
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended.Design", "Src\WPFToolkit.Extended.Design\WPFToolkit.Extended.Design.csproj", "{FA6645C6-7CA5-427C-91F2-916D9FECD76C}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended.DataVisualization", "Src\WPFToolkit.Extended.DataVisualization\WPFToolkit.Extended.DataVisualization.csproj", "{C921A4BC-1781-4A14-B1D0-C41E49C7606A}"
+EndProject
Global
GlobalSection(TeamFoundationVersionControl) = preSolution
- SccNumberOfProjects = 4
+ SccNumberOfProjects = 5
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs02
SccLocalPath0 = .
@@ -22,6 +24,9 @@ Global
SccProjectUniqueName3 = Src\\WPFToolkit.Extended.Design\\WPFToolkit.Extended.Design.csproj
SccProjectName3 = Src/WPFToolkit.Extended.Design
SccLocalPath3 = Src\\WPFToolkit.Extended.Design
+ SccProjectUniqueName4 = Src\\WPFToolkit.Extended.DataVisualization\\WPFToolkit.Extended.DataVisualization.csproj
+ SccProjectName4 = Src/WPFToolkit.Extended.DataVisualization
+ SccLocalPath4 = Src\\WPFToolkit.Extended.DataVisualization
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -62,6 +67,16 @@ Global
{FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|x86.ActiveCfg = Release|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {C921A4BC-1781-4A14-B1D0-C41E49C7606A}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/AggregatedObservableCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/AggregatedObservableCollection.cs
new file mode 100644
index 00000000..55a5cefe
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/AggregatedObservableCollection.cs
@@ -0,0 +1,175 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using System.Linq;
+
+namespace System.Windows.Controls.DataVisualization
+{
+ ///
+ /// Aggregated observable collection.
+ ///
+ /// The type of the items in the observable collections.
+ ///
+ internal class AggregatedObservableCollection : ReadOnlyObservableCollection
+ {
+ ///
+ /// Initializes a new instance of an aggregated observable collection.
+ ///
+ public AggregatedObservableCollection()
+ {
+ this.ChildCollections = new NoResetObservableCollection();
+ this.ChildCollections.CollectionChanged += new NotifyCollectionChangedEventHandler(ChildCollectionsCollectionChanged);
+ }
+
+ ///
+ /// Rebuilds the list if a collection changes.
+ ///
+ /// The source of the event.
+ /// Information about the event.
+ private void ChildCollectionsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
+ {
+ Debug.Assert(e.Action != NotifyCollectionChangedAction.Reset, "Reset is not supported.");
+
+ if (e.Action == NotifyCollectionChangedAction.Add)
+ {
+ e.NewItems
+ .OfType()
+ .ForEachWithIndex((newCollection, index) =>
+ {
+ int startingIndex = GetStartingIndexOfCollectionAtIndex(e.NewStartingIndex + index);
+ foreach (T item in newCollection.OfType().Reverse())
+ {
+ this.Mutate(items => items.Insert(startingIndex, item));
+ }
+
+ INotifyCollectionChanged notifyCollectionChanged = newCollection as INotifyCollectionChanged;
+ if (notifyCollectionChanged != null)
+ {
+ notifyCollectionChanged.CollectionChanged += ChildCollectionCollectionChanged;
+ }
+ });
+ }
+ else if (e.Action == NotifyCollectionChangedAction.Remove)
+ {
+ foreach (IList oldCollection in e.OldItems)
+ {
+ INotifyCollectionChanged notifyCollectionChanged = oldCollection as INotifyCollectionChanged;
+ if (notifyCollectionChanged != null)
+ {
+ notifyCollectionChanged.CollectionChanged -= ChildCollectionCollectionChanged;
+ }
+
+ foreach (T item in oldCollection)
+ {
+ this.Mutate(items => items.Remove(item));
+ }
+ }
+ }
+ else if (e.Action == NotifyCollectionChangedAction.Replace)
+ {
+ foreach (IList oldCollection in e.OldItems)
+ {
+ INotifyCollectionChanged notifyCollectionChanged = oldCollection as INotifyCollectionChanged;
+ if (notifyCollectionChanged != null)
+ {
+ notifyCollectionChanged.CollectionChanged -= ChildCollectionCollectionChanged;
+ }
+ }
+
+ foreach (IList newCollection in e.NewItems)
+ {
+ INotifyCollectionChanged notifyCollectionChanged = newCollection as INotifyCollectionChanged;
+ if (notifyCollectionChanged != null)
+ {
+ notifyCollectionChanged.CollectionChanged += ChildCollectionCollectionChanged;
+ }
+ }
+
+ Rebuild();
+ }
+ }
+
+ ///
+ /// Synchronizes the collection with changes made in a child collection.
+ ///
+ /// The source of the event.
+ /// Information about the event.
+ private void ChildCollectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+ {
+ Debug.Assert(e.Action != NotifyCollectionChangedAction.Reset, "Reset is not supported.");
+ IList collectionSender = sender as IList;
+
+ if (e.Action == NotifyCollectionChangedAction.Add)
+ {
+ int startingIndex = GetStartingIndexOfCollectionAtIndex(ChildCollections.IndexOf(collectionSender));
+ e.NewItems
+ .OfType()
+ .ForEachWithIndex((item, index) =>
+ {
+ this.Mutate(that => that.Insert(startingIndex + e.NewStartingIndex + index, item));
+ });
+ }
+ else if (e.Action == NotifyCollectionChangedAction.Remove)
+ {
+ foreach (T item in e.OldItems.OfType())
+ {
+ this.Mutate(that => that.Remove(item));
+ }
+ }
+ else if (e.Action == NotifyCollectionChangedAction.Replace)
+ {
+ for (int cnt = 0; cnt < e.NewItems.Count; cnt++)
+ {
+ T oldItem = (T)e.OldItems[cnt];
+ T newItem = (T)e.NewItems[cnt];
+ int oldItemIndex = this.IndexOf(oldItem);
+ this.Mutate((that) =>
+ {
+ that[oldItemIndex] = newItem;
+ });
+ }
+ }
+ }
+
+ ///
+ /// Returns the starting index of a collection in the aggregate
+ /// collection.
+ ///
+ /// The starting index of a collection.
+ /// The starting index of the collection in the aggregate
+ /// collection.
+ private int GetStartingIndexOfCollectionAtIndex(int index)
+ {
+ return ChildCollections.OfType().Select(collection => collection.CastWrapper()).Take(index).SelectMany(collection => collection).Count();
+ }
+
+ ///
+ /// Rebuild the list in the correct order when a child collection
+ /// changes.
+ ///
+ private void Rebuild()
+ {
+ this.Mutate(that => that.Clear());
+ this.Mutate(that =>
+ {
+ IList items = ChildCollections.OfType().Select(collection => collection.CastWrapper()).SelectMany(collection => collection).ToList();
+ foreach (T item in items)
+ {
+ that.Add(item);
+ }
+ });
+ }
+
+ ///
+ /// Gets child collections of the aggregated collection.
+ ///
+ public ObservableCollection ChildCollections { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/AnimationSequence.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/AnimationSequence.cs
new file mode 100644
index 00000000..ca2fb6a6
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/AnimationSequence.cs
@@ -0,0 +1,29 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// Specifies the supported animation sequences.
+ ///
+ /// Preview
+ public enum AnimationSequence
+ {
+ ///
+ /// Animates all of the data points simultaneously.
+ ///
+ Simultaneous = 0,
+
+ ///
+ /// Animates the data points from first to last.
+ ///
+ FirstToLast = 1,
+
+ ///
+ /// Animates the data points from last to first.
+ ///
+ LastToFirst = 2
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/Axis.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/Axis.cs
new file mode 100644
index 00000000..cc6fbce6
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/Axis.cs
@@ -0,0 +1,237 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Windows;
+using System.Windows.Controls;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// An axis class used to determine the plot area coordinate of values.
+ ///
+ public abstract class Axis : Control, IAxis
+ {
+ #region public AxisLocation Location
+ ///
+ /// Gets or sets the axis location.
+ ///
+ public AxisLocation Location
+ {
+ get { return (AxisLocation)GetValue(LocationProperty); }
+ set { SetValue(LocationProperty, value); }
+ }
+
+ ///
+ /// Identifies the Location dependency property.
+ ///
+ public static readonly DependencyProperty LocationProperty =
+ DependencyProperty.Register(
+ "Location",
+ typeof(AxisLocation),
+ typeof(Axis),
+ new PropertyMetadata(AxisLocation.Auto, OnLocationPropertyChanged));
+
+ ///
+ /// LocationProperty property changed handler.
+ ///
+ /// Axis that changed its Location.
+ /// Event arguments.
+ private static void OnLocationPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ Axis source = (Axis)d;
+ AxisLocation oldValue = (AxisLocation)e.OldValue;
+ AxisLocation newValue = (AxisLocation)e.NewValue;
+ source.OnLocationPropertyChanged(oldValue, newValue);
+ }
+
+ ///
+ /// LocationProperty property changed handler.
+ ///
+ /// Old value.
+ /// New value.
+ protected virtual void OnLocationPropertyChanged(AxisLocation oldValue, AxisLocation newValue)
+ {
+ RoutedPropertyChangedEventHandler handler = this.LocationChanged;
+ if (handler != null)
+ {
+ handler(this, new RoutedPropertyChangedEventArgs(oldValue, newValue));
+ }
+ }
+
+ ///
+ /// This event is raised when the location property is changed.
+ ///
+ public event RoutedPropertyChangedEventHandler LocationChanged;
+
+ #endregion public AxisLocation Location
+
+ ///
+ /// Gets the list of child axes belonging to this axis.
+ ///
+ public ObservableCollection DependentAxes { get; private set; }
+
+ #region public AxisOrientation Orientation
+ ///
+ /// Gets or sets the orientation of the axis.
+ ///
+ public AxisOrientation Orientation
+ {
+ get { return (AxisOrientation)GetValue(OrientationProperty); }
+ set { SetValue(OrientationProperty, value); }
+ }
+
+ ///
+ /// Identifies the Orientation dependency property.
+ ///
+ public static readonly DependencyProperty OrientationProperty =
+ DependencyProperty.Register(
+ "Orientation",
+ typeof(AxisOrientation),
+ typeof(Axis),
+ new PropertyMetadata(AxisOrientation.None, OnOrientationPropertyChanged));
+
+ ///
+ /// OrientationProperty property changed handler.
+ ///
+ /// Axis that changed its Orientation.
+ /// Event arguments.
+ private static void OnOrientationPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ Axis source = (Axis)d;
+ AxisOrientation oldValue = (AxisOrientation)e.OldValue;
+ AxisOrientation newValue = (AxisOrientation)e.NewValue;
+ source.OnOrientationPropertyChanged(oldValue, newValue);
+ }
+
+ ///
+ /// OrientationProperty property changed handler.
+ ///
+ /// Old value.
+ /// New value.
+ protected virtual void OnOrientationPropertyChanged(AxisOrientation oldValue, AxisOrientation newValue)
+ {
+ RoutedPropertyChangedEventHandler handler = OrientationChanged;
+ if (handler != null)
+ {
+ handler(this, new RoutedPropertyChangedEventArgs(oldValue, newValue));
+ }
+ }
+
+ ///
+ /// This event is raised when the Orientation property is changed.
+ ///
+ public event RoutedPropertyChangedEventHandler OrientationChanged;
+
+ #endregion public AxisOrientation Orientation
+
+ ///
+ /// Raises the invalidated event.
+ ///
+ /// Information about the event.
+ protected virtual void OnInvalidated(RoutedEventArgs args)
+ {
+ foreach (IAxisListener listener in RegisteredListeners)
+ {
+ listener.AxisInvalidated(this);
+ }
+ }
+
+ ///
+ /// Gets or the collection of series that are using the Axis.
+ ///
+ public ObservableCollection RegisteredListeners { get; private set; }
+
+ ///
+ /// Returns a value indicating whether the axis can plot a value.
+ ///
+ /// The value to plot.
+ /// A value indicating whether the axis can plot a value.
+ ///
+ public abstract bool CanPlot(object value);
+
+ ///
+ /// The plot area coordinate of a value.
+ ///
+ /// The value for which to retrieve the plot area
+ /// coordinate.
+ /// The plot area coordinate.
+ public abstract UnitValue GetPlotAreaCoordinate(object value);
+
+ ///
+ /// Instantiates a new instance of the Axis class.
+ ///
+ protected Axis()
+ {
+ RegisteredListeners = new UniqueObservableCollection();
+ this.RegisteredListeners.CollectionChanged += RegisteredListenersCollectionChanged;
+ this.DependentAxes = new ObservableCollection();
+ this.DependentAxes.CollectionChanged += OnChildAxesCollectionChanged;
+ }
+
+ ///
+ /// Child axes collection changed.
+ ///
+ /// The source of the event.
+ /// Information about the event.
+ private void OnChildAxesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+ {
+ this.OnDependentAxesCollectionChanged();
+ }
+
+ ///
+ /// Child axes collection changed.
+ ///
+ protected virtual void OnDependentAxesCollectionChanged()
+ {
+ }
+
+ ///
+ /// This event is raised when the registered listeners collection is
+ /// changed.
+ ///
+ /// The source of the event.
+ /// Information about the event.
+ private void RegisteredListenersCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
+ {
+ if (e.OldItems != null)
+ {
+ foreach (IAxisListener obj in e.OldItems)
+ {
+ OnObjectUnregistered(obj);
+ }
+ }
+ if (e.NewItems != null)
+ {
+ foreach (IAxisListener obj in e.NewItems)
+ {
+ OnObjectRegistered(obj);
+ }
+ }
+ }
+
+ ///
+ /// This method is invoked when a series is registered.
+ ///
+ /// The series that has been registered.
+ protected virtual void OnObjectRegistered(IAxisListener series)
+ {
+ }
+
+ ///
+ /// This method is invoked when a series is unregistered.
+ ///
+ /// The series that has been unregistered.
+ protected virtual void OnObjectUnregistered(IAxisListener series)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisIntervalType.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisIntervalType.cs
new file mode 100644
index 00000000..301d3e13
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisIntervalType.cs
@@ -0,0 +1,64 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// Specifies an interval type.
+ ///
+ /// Preview
+ internal enum AxisIntervalType
+ {
+ ///
+ /// Automatically determined by the ISeriesHost control.
+ ///
+ Auto = 0,
+
+ ///
+ /// The interval type is numerical.
+ ///
+ Number = 1,
+
+ ///
+ /// The interval type is years.
+ ///
+ Years = 2,
+
+ ///
+ /// The interval type is months.
+ ///
+ Months = 3,
+
+ ///
+ /// The interval type is weeks.
+ ///
+ Weeks = 4,
+
+ ///
+ /// The interval type is days.
+ ///
+ Days = 5,
+
+ ///
+ /// The interval type is hours.
+ ///
+ Hours = 6,
+
+ ///
+ /// The interval type is minutes.
+ ///
+ Minutes = 7,
+
+ ///
+ /// The interval type is seconds.
+ ///
+ Seconds = 8,
+
+ ///
+ /// The interval type is milliseconds.
+ ///
+ Milliseconds = 9,
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLabel.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLabel.cs
new file mode 100644
index 00000000..75ac6f65
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLabel.cs
@@ -0,0 +1,112 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// A label used to display data in an axis.
+ ///
+ public class AxisLabel : Control
+ {
+ #region public string StringFormat
+ ///
+ /// Gets or sets the text string format.
+ ///
+ public string StringFormat
+ {
+ get { return GetValue(StringFormatProperty) as string; }
+ set { SetValue(StringFormatProperty, value); }
+ }
+
+ ///
+ /// Identifies the StringFormat dependency property.
+ ///
+ public static readonly DependencyProperty StringFormatProperty =
+ DependencyProperty.Register(
+ "StringFormat",
+ typeof(string),
+ typeof(AxisLabel),
+ new PropertyMetadata(null, OnStringFormatPropertyChanged));
+
+ ///
+ /// StringFormatProperty property changed handler.
+ ///
+ /// AxisLabel that changed its StringFormat.
+ /// Event arguments.
+ private static void OnStringFormatPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ AxisLabel source = (AxisLabel)d;
+ string newValue = (string)e.NewValue;
+ source.OnStringFormatPropertyChanged(newValue);
+ }
+
+ ///
+ /// StringFormatProperty property changed handler.
+ ///
+ /// New value.
+ protected virtual void OnStringFormatPropertyChanged(string newValue)
+ {
+ UpdateFormattedContent();
+ }
+ #endregion public string StringFormat
+
+ #region public string FormattedContent
+ ///
+ /// Gets the formatted content property.
+ ///
+ public string FormattedContent
+ {
+ get { return GetValue(FormattedContentProperty) as string; }
+ protected set { SetValue(FormattedContentProperty, value); }
+ }
+
+ ///
+ /// Identifies the FormattedContent dependency property.
+ ///
+ public static readonly DependencyProperty FormattedContentProperty =
+ DependencyProperty.Register(
+ "FormattedContent",
+ typeof(string),
+ typeof(AxisLabel),
+ new PropertyMetadata(null));
+ #endregion public string FormattedContent
+
+#if !SILVERLIGHT
+ ///
+ /// Initializes the static members of the AxisLabel class.
+ ///
+ [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "Dependency properties are initialized in-line.")]
+ static AxisLabel()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(AxisLabel), new FrameworkPropertyMetadata(typeof(AxisLabel)));
+ }
+
+#endif
+ ///
+ /// Instantiates a new instance of the AxisLabel class.
+ ///
+ public AxisLabel()
+ {
+#if SILVERLIGHT
+ this.DefaultStyleKey = typeof(AxisLabel);
+#endif
+ this.SetBinding(FormattedContentProperty, new Binding { Converter = new StringFormatConverter(), ConverterParameter = StringFormat ?? "{0}" });
+ }
+
+ ///
+ /// Updates the formatted text.
+ ///
+ protected virtual void UpdateFormattedContent()
+ {
+ this.SetBinding(FormattedContentProperty, new Binding { Converter = new StringFormatConverter(), ConverterParameter = StringFormat ?? "{0}" });
+ }
+ }
+}
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLocation.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLocation.cs
new file mode 100644
index 00000000..cc3cf6db
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisLocation.cs
@@ -0,0 +1,38 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// Axis position.
+ ///
+ public enum AxisLocation
+ {
+ ///
+ /// Location is determined automatically.
+ ///
+ Auto,
+
+ ///
+ /// Left in the series host area.
+ ///
+ Left,
+
+ ///
+ /// Top in the series host area.
+ ///
+ Top,
+
+ ///
+ /// Right in the series host area.
+ ///
+ Right,
+
+ ///
+ /// Bottom of the series host area.
+ ///
+ Bottom,
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisOrientation.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisOrientation.cs
new file mode 100644
index 00000000..063dd267
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/AxisOrientation.cs
@@ -0,0 +1,31 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// Specifies the orientation of an axis.
+ ///
+ /// Preview
+ public enum AxisOrientation
+ {
+ ///
+ /// Orientation is automatically set.
+ ///
+ None,
+
+ ///
+ /// Indicates the axis plots along the X axis.
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "X", Justification = "X is the expected terminology.")]
+ X,
+
+ ///
+ /// Indicates the axis plots along the Y axis.
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Y", Justification = "Y is the expected terminology.")]
+ Y,
+ }
+}
\ No newline at end of file
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/CategoryAxis.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/CategoryAxis.cs
new file mode 100644
index 00000000..68cc3a93
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.DataVisualization/Charting/Axis/CategoryAxis.cs
@@ -0,0 +1,363 @@
+// (c) Copyright Microsoft Corporation.
+// This source is subject to the Microsoft Public License (Ms-PL).
+// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
+// All other rights reserved.
+
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Windows.Shapes;
+
+namespace System.Windows.Controls.DataVisualization.Charting
+{
+ ///
+ /// An axis that displays categories.
+ ///
+ [StyleTypedProperty(Property = "GridLineStyle", StyleTargetType = typeof(Line))]
+ [StyleTypedProperty(Property = "MajorTickMarkStyle", StyleTargetType = typeof(Line))]
+ [StyleTypedProperty(Property = "AxisLabelStyle", StyleTargetType = typeof(AxisLabel))]
+ [StyleTypedProperty(Property = "TitleStyle", StyleTargetType = typeof(Title))]
+ [TemplatePart(Name = AxisGridName, Type = typeof(Grid))]
+ [TemplatePart(Name = AxisTitleName, Type = typeof(Title))]
+ public class CategoryAxis : DisplayAxis, ICategoryAxis
+ {
+ ///
+ /// A pool of major tick marks.
+ ///
+ private ObjectPool _majorTickMarkPool;
+
+ ///
+ /// A pool of labels.
+ ///
+ private ObjectPool _labelPool;
+
+ #region public CategorySortOrder SortOrder
+ ///
+ /// Gets or sets the sort order used for the categories.
+ ///
+ public CategorySortOrder SortOrder
+ {
+ get { return (CategorySortOrder)GetValue(SortOrderProperty); }
+ set { SetValue(SortOrderProperty, value); }
+ }
+
+ ///
+ /// Identifies the SortOrder dependency property.
+ ///
+ public static readonly DependencyProperty SortOrderProperty =
+ DependencyProperty.Register(
+ "SortOrder",
+ typeof(CategorySortOrder),
+ typeof(CategoryAxis),
+ new PropertyMetadata(CategorySortOrder.None, OnSortOrderPropertyChanged));
+
+ ///
+ /// SortOrderProperty property changed handler.
+ ///
+ /// CategoryAxis that changed its SortOrder.
+ /// Event arguments.
+ private static void OnSortOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ CategoryAxis source = (CategoryAxis)d;
+ source.OnSortOrderPropertyChanged();
+ }
+
+ ///
+ /// SortOrderProperty property changed handler.
+ ///
+ private void OnSortOrderPropertyChanged()
+ {
+ Invalidate();
+ }
+ #endregion public CategorySortOrder SortOrder
+
+ ///
+ /// Gets or sets a list of categories to display.
+ ///
+ private IList