<NME> WpfExamples.csproj
<BEF> ﻿<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
      <TargetFramework>netcoreapp3.1</TargetFramework>
      <UseWPF>true</UseWPF>
      <UseWindowsForms>true</UseWindowsForms>
      <OutputType>WinExe</OutputType>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\..\OxyPlot.Wpf\OxyPlot.Wpf.csproj" />
    <ProjectReference Include="..\..\..\OxyPlot\OxyPlot.csproj" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="PropertyTools.Wpf" Version="3.1.0-alpha0009" />
  </ItemGroup>
  <ItemGroup>
    <None Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="..\..\..\..\Icons\OxyPlot_64.png" Link="OxyPlot_64.png">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\WorldStatisticsDemo\Data\gdp_per_capita_ppp.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\WorldStatisticsDemo\Data\life_expectancy_at_birth.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\WorldStatisticsDemo\Data\population.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\CsvDemo\Data\GlobalTemperatureAnomaly.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\CsvDemo\Data\RiverFlow.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\CsvDemo\Data\WorldPopulation.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup>
    <Resource Include="Images\*.png" />
    <Content Include="Examples\WorldStatisticsDemo\Data\gdp_per_capita_ppp.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\WorldStatisticsDemo\Data\life_expectancy_at_birth.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Examples\WorldStatisticsDemo\Data\population.csv">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <None Include="ReadMe.txt" />
    <Resource Include="Examples\HistogramDemo\hare.jpg" />
  </ItemGroup>
</Project>
    <Compile Include="Examples\AlignedAxesDemo\MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Examples\AnimationsDemo\AnimationExtensions.cs" />
    <Compile Include="Examples\AnimationsDemo\MainViewModel.cs" />
    <Compile Include="Examples\AnimationsDemo\MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
    </Compile>
      <DependentUpon>PlotViewDataTemplateWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="ScreenCapture.cs" />
    <Page Include="Examples\AnimationsDemo\MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>

<MSG> Merge pull request #782 from GeertvanHorrik/pr/improvedanimations

Improved the animations example so it could be used in PCL as well
<DFF> @@ -69,8 +69,42 @@
     <Compile Include="Examples\AlignedAxesDemo\MainWindow.xaml.cs">
       <DependentUpon>MainWindow.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Examples\AnimationsDemo\AnimationExtensions.cs" />
-    <Compile Include="Examples\AnimationsDemo\MainViewModel.cs" />
+    <Compile Include="Examples\AnimationsDemo\Controls\AnimationSettingsControl.xaml.cs">
+      <DependentUpon>AnimationSettingsControl.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\NoEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\SineEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\QuinticEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\QuarticEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\QuadraticEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\PowerEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\BounceEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\BackEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\CircleEase.cs" />
+    <Compile Include="Examples\AnimationsDemo\Extensions\AnimationExtensions.cs" />
+    <Compile Include="Examples\AnimationsDemo\Extensions\AnimationExtensions.datapointseries.cs" />
+    <Compile Include="Examples\AnimationsDemo\Extensions\AnimationExtensions.lineseries.cs" />
+    <Compile Include="Examples\AnimationsDemo\Extensions\AnimationExtensions.linearbarseries.cs" />
+    <Compile Include="Examples\AnimationsDemo\Models\AnimationFrame.cs" />
+    <Compile Include="Examples\AnimationsDemo\Models\AnimationPoint.cs" />
+    <Compile Include="Examples\AnimationsDemo\Models\AnimationSettings.cs" />
+    <Compile Include="Examples\AnimationsDemo\Models\Interfaces\IAnimatablePoint.cs" />
+    <Compile Include="Examples\AnimationsDemo\Models\Pnl.cs" />
+    <Compile Include="Examples\AnimationsDemo\ViewModels\AnimationViewModelBase.cs" />
+    <Compile Include="Examples\AnimationsDemo\EasingFunctions\Interfaces\IEasingFunction.cs" />
+    <Compile Include="Examples\AnimationsDemo\ViewModels\Interfaces\IAnimationViewModel.cs" />
+    <Compile Include="Examples\AnimationsDemo\ViewModels\AreaSeriesViewModel.cs" />
+    <Compile Include="Examples\AnimationsDemo\ViewModels\LineSeriesViewModel.cs" />
+    <Compile Include="Examples\AnimationsDemo\Views\AreaSeriesView.xaml.cs">
+      <DependentUpon>AreaSeriesView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Examples\AnimationsDemo\Views\LineSeriesView.xaml.cs">
+      <DependentUpon>LineSeriesView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Examples\AnimationsDemo\Views\LinearBarView.xaml.cs">
+      <DependentUpon>LinearBarView.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Examples\AnimationsDemo\ViewModels\LinearBarViewModel.cs" />
     <Compile Include="Examples\AnimationsDemo\MainWindow.xaml.cs">
       <DependentUpon>MainWindow.xaml</DependentUpon>
     </Compile>
@@ -110,6 +144,22 @@
       <DependentUpon>PlotViewDataTemplateWindow.xaml</DependentUpon>
     </Compile>
     <Compile Include="ScreenCapture.cs" />
+    <Page Include="Examples\AnimationsDemo\Controls\AnimationSettingsControl.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Examples\AnimationsDemo\Views\AreaSeriesView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Examples\AnimationsDemo\Views\LineSeriesView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Examples\AnimationsDemo\Views\LinearBarView.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Examples\AnimationsDemo\MainWindow.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

{'commit': 'diff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/AnimationExtensions.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/AnimationExtensions.cs\ndeleted file mode 100644\nindex bccdec78..00000000\n--- a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/AnimationExtensions.cs\n+++ /dev/null\n@@ -1,112 +0,0 @@\n-\ufeff// --------------------------------------------------------------------------------------------------------------------\n-// <copyright file="MainViewModel.cs" company="OxyPlot">\n-//   Copyright (c) 2014 OxyPlot contributors\n-// </copyright>\n-// --------------------------------------------------------------------------------------------------------------------\n-\n-\n-namespace AnimationsDemo\n-{\n-    using System;\n-    using System.Collections.Generic;\n-    using System.Linq;\n-    using System.Threading.Tasks;\n-    using System.Windows.Media.Animation;\n-\n-    using OxyPlot;\n-    using OxyPlot.Series;\n-\n-    public static class AnimationExtensions\n-    {\n-        public static void AnimateSeries<TEase>(\n-            this PlotModel plotModel,\n-            ItemsSeries series,\n-            double? minimumValue = null,\n-            TimeSpan duration = default(TimeSpan),\n-            double animationFrameDurationInMs = 10) \n-            where TEase : EasingFunctionBase, new()\n-        {\n-            var easingFunction = new TEase();\n-\n-            AnimateSeries(plotModel, series, easingFunction, minimumValue, duration, animationFrameDurationInMs);\n-        }\n-\n-        public static async void AnimateSeries(\n-            this PlotModel plotModel,\n-            ItemsSeries series,\n-            EasingFunctionBase easingFunction,\n-            double? minimumValue = null,\n-            TimeSpan duration = default(TimeSpan),\n-            double animationFrameDurationInMs = 10)\n-        {\n-            if (duration == default(TimeSpan))\n-            {\n-                duration = TimeSpan.FromMilliseconds(300);\n-            }\n-\n-            var animationDuration = TimeSpan.FromMilliseconds(animationFrameDurationInMs);\n-            var animationFrames = (int)(duration.TotalMilliseconds / animationFrameDurationInMs);\n-\n-            var valuesToAnimate = new List<List<double>>();\n-\n-            var items = series.ItemsSource.Cast<object>().ToList();\n-\n-            foreach (var point in items)\n-            {\n-                var measurePoint = point as Pnl;\n-                if (measurePoint != null)\n-                {\n-                    var pointMinimum = 0d;\n-                    if (minimumValue.HasValue)\n-                    {\n-                        pointMinimum = minimumValue.Value;\n-                    }\n-\n-                    var delta = measurePoint.Value - pointMinimum;\n-                    var animationValues = CalculateEaseValues(delta, animationFrames - 1, easingFunction, pointMinimum);\n-                    animationValues.Add(measurePoint.Value);\n-\n-                    valuesToAnimate.Add(animationValues);\n-                    measurePoint.Value = animationValues.First();\n-                }\n-            }\n-\n-            // First frame animation\n-            await Task.Delay(animationDuration);\n-\n-            for (var i = 0; i < animationFrames; i++)\n-            {\n-                for (var j = 0; j < items.Count; j++)\n-                {\n-                    var measurePoint = items[j] as Pnl;\n-                    if (measurePoint != null)\n-                    {\n-                        var animationInfo = valuesToAnimate[j];\n-                        measurePoint.Value = animationInfo[i];\n-                    }\n-                }\n-\n-                plotModel.InvalidatePlot(true);\n-\n-                await Task.Delay(animationDuration);\n-            }\n-        }\n-\n-        private static List<double> CalculateEaseValues(double range, int count, EasingFunctionBase easingFunction, double baseValue = 0d)\n-        {\n-            var items = new List<double>();\n-\n-            var easePhase = 1d / count;\n-\n-            for (var i = 0; i < count; i++)\n-            {\n-                var valueToEase = easePhase * i;\n-                var easeValue = easingFunction.Ease(valueToEase);\n-\n-                items.Add(baseValue + (easeValue * range));\n-            }\n-\n-            return items;\n-        }\n-    }\n-}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml\nnew file mode 100644\nindex 00000000..86b1e3f9\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml\n@@ -0,0 +1,42 @@\n+\ufeff<UserControl x:Class="AnimationsDemo.AnimationSettingsControl"\n+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" \n+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" \n+             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">\n+\n+    <Grid>\n+        <Grid.RowDefinitions>\n+            <RowDefinition Height="Auto" />\n+            <RowDefinition Height="Auto" />\n+            <RowDefinition Height="Auto" />\n+        </Grid.RowDefinitions>\n+        \n+        <StackPanel Grid.Row="0" Orientation="Horizontal">\n+            <Label Content="Total duration (ms)" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <TextBox Text="{Binding AnimationDuration}" Margin="6,4,6,4" Height="25" Width="50" VerticalContentAlignment="Center" />\n+\n+            <Label Content="Frame duration (ms)" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <TextBox Text="{Binding AnimationFrameDuration}" Margin="6,4,6,4" Height="25" Width="50" VerticalContentAlignment="Center" />\n+\n+            <Label Content="Delay (ms)" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <TextBox Text="{Binding AnimationDelay}" Margin="6,4,6,4" Height="25" Width="50" VerticalContentAlignment="Center" />\n+        </StackPanel>\n+\n+        <StackPanel Grid.Row="1" Orientation="Horizontal">\n+            <Label Content="Easing function" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <ComboBox ItemsSource="{Binding EasingFunctions}" SelectedItem="{Binding SelectedEasingFunction}" \n+                      DisplayMemberPath="Name" Margin="6,4,6,4" Height="25" Width="100" VerticalContentAlignment="Center"\n+                      IsEnabled="{Binding SupportsEasingFunction}"/>            \n+            \n+            <Label Content="Horizontal %" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <TextBox Text="{Binding HorizontalPercentage}" Margin="6,4,6,4" Height="25" Width="50" VerticalContentAlignment="Center" />\n+\n+            <Label Content="Vertical %" VerticalAlignment="Center" Margin="6,4,6,4" />\n+            <TextBox Text="{Binding VerticalPercentage}" Margin="6,4,6,4" Height="25" Width="50" VerticalContentAlignment="Center" />\n+\n+            <Button Content="Animate" Click="OnAnimateClick" Width="75" Margin="6,4,6,4" Height="25" />\n+        </StackPanel>\n+    </Grid>\n+\n+</UserControl>\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml.cs\nnew file mode 100644\nindex 00000000..f2f7b87b\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Controls/AnimationSettingsControl.xaml.cs\n@@ -0,0 +1,27 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="LinearBarView.xaml.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System.Windows;\n+\n+    public partial class AnimationSettingsControl\n+    {\n+        public AnimationSettingsControl()\n+        {\n+            this.InitializeComponent();\n+        }\n+\n+        private async void OnAnimateClick(object sender, RoutedEventArgs e)\n+        {\n+            var vm = this.DataContext as IAnimationViewModel;\n+            if (vm != null)\n+            {\n+                await vm.AnimateAsync();\n+            }\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BackEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BackEase.cs\nnew file mode 100644\nindex 00000000..9046a39a\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BackEase.cs\n@@ -0,0 +1,27 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="BackEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    public class BackEase : IEasingFunction\n+    {\n+        public BackEase()\n+        {\n+            this.Amplitude = 1d;\n+        }\n+\n+        public double Amplitude { get; set; }\n+\n+        public double Ease(double value)\n+        {\n+            var num = Math.Max(0.0, this.Amplitude);\n+            return Math.Pow(value, 3.0) - value * num * Math.Sin(Math.PI * value);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BounceEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BounceEase.cs\nnew file mode 100644\nindex 00000000..445c9ed1\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/BounceEase.cs\n@@ -0,0 +1,46 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="BounceEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    public class BounceEase : IEasingFunction\n+    {\n+        public BounceEase()\n+        {\n+            this.Bounces = 3;\n+            this.Bounciness = 2d;\n+        }\n+\n+        public int Bounces { get; set; }\n+\n+        public double Bounciness { get; set; }\n+\n+        public double Ease(double value)\n+        {\n+            double y1 = Math.Max(0.0, (double)this.Bounces);\n+            double num1 = this.Bounciness;\n+            if (num1 < 1.0 || num1 == 1d)\n+                num1 = 1001.0 / 1000.0;\n+            double num2 = Math.Pow(num1, y1);\n+            double num3 = 1.0 - num1;\n+            double num4 = (1.0 - num2) / num3 + num2 * 0.5;\n+            double y2 = Math.Floor(Math.Log(-(value * num4) * (1.0 - num1) + 1.0, num1));\n+            double y3 = y2 + 1.0;\n+            double num5 = (1.0 - Math.Pow(num1, y2)) / (num3 * num4);\n+            double num6 = (1.0 - Math.Pow(num1, y3)) / (num3 * num4);\n+            double num7 = (num5 + num6) * 0.5;\n+            double num8 = value - num7;\n+            double num9 = num7 - num5;\n+            double num10 = -Math.Pow(1.0 / num1, y1 - y2);\n+            double num11 = num9;\n+            double num12 = num11 * num11;\n+            return num10 / num12 * (num8 - num9) * (num8 + num9);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/CircleEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/CircleEase.cs\nnew file mode 100644\nindex 00000000..e0d6eb51\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/CircleEase.cs\n@@ -0,0 +1,29 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="CircleEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    using AnimationsDemo;\n+\n+    public class CircleEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            value = Math.Max(0.0, Math.Min(1.0, value));\n+\n+            var num1 = 1.0;\n+            var num2 = 1.0;\n+            var num3 = value;\n+            var num4 = num3 * num3;\n+            var num5 = Math.Sqrt(num2 - num4);\n+\n+            return num1 - num5;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/Interfaces/IEasingFunction.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/Interfaces/IEasingFunction.cs\nnew file mode 100644\nindex 00000000..055729a4\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/Interfaces/IEasingFunction.cs\n@@ -0,0 +1,13 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="MainViewModel.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    public interface IEasingFunction\n+    {\n+        double Ease(double value);\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/NoEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/NoEase.cs\nnew file mode 100644\nindex 00000000..fae473ed\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/NoEase.cs\n@@ -0,0 +1,16 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="BackEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    public class NoEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            return 1d;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/PowerEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/PowerEase.cs\nnew file mode 100644\nindex 00000000..9e4abec7\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/PowerEase.cs\n@@ -0,0 +1,27 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="PowerEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    public class PowerEase : IEasingFunction\n+    {\n+        public PowerEase()\n+        {\n+            this.Power = 2d;\n+        }\n+\n+        public double Power { get; set; }\n+\n+        public double Ease(double value)\n+        {\n+            double y = Math.Max(0.0, this.Power);\n+            return Math.Pow(value, y);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuadraticEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuadraticEase.cs\nnew file mode 100644\nindex 00000000..1b0840f3\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuadraticEase.cs\n@@ -0,0 +1,18 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="QuadraticEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    public class QuadraticEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            double num = value;\n+            return num * num;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuarticEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuarticEase.cs\nnew file mode 100644\nindex 00000000..113e5f31\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuarticEase.cs\n@@ -0,0 +1,18 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="QuadraticEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    public class QuarticEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            double num = value;\n+            return num * num * value * value;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuinticEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuinticEase.cs\nnew file mode 100644\nindex 00000000..eb668b0a\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/QuinticEase.cs\n@@ -0,0 +1,18 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="QuinticEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    public class QuinticEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            double num = value;\n+            return num * num * value * value * value;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/SineEase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/SineEase.cs\nnew file mode 100644\nindex 00000000..85397bdb\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/EasingFunctions/SineEase.cs\n@@ -0,0 +1,19 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="SineEase.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    public class SineEase : IEasingFunction\n+    {\n+        public double Ease(double value)\n+        {\n+            return 1.0 - Math.Sin(Math.PI / 2.0 * (1.0 - value));\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.cs\nnew file mode 100644\nindex 00000000..864a49a4\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.cs\n@@ -0,0 +1,85 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationExtensions.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+\n+    using OxyPlot.Series;\n+\n+    public static partial class AnimationExtensions\n+    {\n+        private static readonly IEasingFunction DefaultEasingFunction = new NoEase();\n+\n+        static AnimationExtensions()\n+        {\n+            DefaultAnimationDelay = 0;\n+            DefaultAnimationDuration = 750;\n+            DefaultAnimationFrameDuration = 10;\n+        }\n+\n+        public static int DefaultAnimationDelay { get; set; }\n+\n+        public static int DefaultAnimationDuration { get; set; }\n+\n+        public static int DefaultAnimationFrameDuration { get; set; }\n+\n+        private static List<double> CalculateEaseValues(double range, int count, IEasingFunction easingFunction, double baseValue = 0d)\n+        {\n+            var items = new List<double>();\n+\n+            var easePhase = 1d / count;\n+\n+            for (var i = 0; i < count; i++)\n+            {\n+                var valueToEase = easePhase * i;\n+                var easeValue = easingFunction.Ease(valueToEase);\n+\n+                items.Add(baseValue + (easeValue * range));\n+            }\n+\n+            return items;\n+        }\n+\n+        private static void InsertDelayAnimationFrame(this List<AnimationFrame> animationFrames, TimeSpan delay)\n+        {\n+            if (animationFrames.Count < 2)\n+            {\n+                return;\n+            }\n+\n+            if (delay <= TimeSpan.Zero)\n+            {\n+                return;\n+            }\n+\n+            var animationFrame = new AnimationFrame\n+            {\n+                Duration = delay\n+            };\n+\n+            animationFrames.Insert(1, animationFrame);\n+        }\n+\n+        private static List<IAnimatablePoint> GetAnimatablePoints(this DataPointSeries series)\n+        {\n+            var points = new List<IAnimatablePoint>();\n+\n+            var itemsSource = series.ItemsSource;\n+            if (itemsSource != null)\n+            {\n+                points.AddRange(from x in itemsSource.Cast<object>()\n+                                where x is IAnimatablePoint\n+                                select (IAnimatablePoint)x);\n+            }\n+\n+            return points;\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.datapointseries.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.datapointseries.cs\nnew file mode 100644\nindex 00000000..e035cb8f\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.datapointseries.cs\n@@ -0,0 +1,114 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationExtensions.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+    using OxyPlot.Series;\n+\n+    public static partial class AnimationExtensions\n+    {\n+        public static AnimationFrame GetFinalAnimationFrame(DataPointSeries series)\n+        {\n+            var animationFrame = new AnimationFrame\n+            {\n+                Duration = TimeSpan.Zero\n+            };\n+\n+            var points = series.GetAnimatablePoints();\n+            foreach (var point in points)\n+            {\n+                animationFrame.AnimationPoints.Add(new AnimationPoint\n+                {\n+                    X = point.FinalX,\n+                    Y = point.FinalY\n+                });\n+            }\n+\n+            return animationFrame;\n+        }\n+\n+        public static async Task AnimateSeriesAsync(\n+            this PlotModel plotModel,\n+            DataPointSeries series,\n+            List<AnimationFrame> animationFrames)\n+        {\n+            if (animationFrames.Count == 0)\n+            {\n+                return;\n+            }\n+\n+            var finalAnimationFrame = GetFinalAnimationFrame(series);\n+            animationFrames.Add(finalAnimationFrame);\n+\n+            var xAxis = plotModel.DefaultXAxis;\n+            var oldXAxisMinimum = xAxis.Minimum;\n+            var oldXAxisMaximum = xAxis.Maximum;\n+\n+            xAxis.Minimum = xAxis.ActualMinimum;\n+            xAxis.Maximum = xAxis.ActualMaximum;\n+\n+            var yAxis = plotModel.DefaultYAxis;\n+            var oldYAxisMinimum = yAxis.Minimum;\n+            var oldYAxisMaximum = yAxis.Maximum;\n+\n+            yAxis.Minimum = yAxis.ActualMinimum;\n+            yAxis.Maximum = yAxis.ActualMaximum;\n+\n+            var previousDataFieldX = series.DataFieldX;\n+            var previousDataFieldY = series.DataFieldY;\n+\n+            // Always fix up the data fields (we are using IAnimatablePoint from now on)\n+            series.DataFieldX = "X";\n+            series.DataFieldY = "Y";\n+\n+            var points = series.GetAnimatablePoints();\n+\n+            foreach (var animationFrame in animationFrames)\n+            {\n+                // TODO: consider implementing the IsVisible feature\n+\n+                var animationPoints = animationFrame.AnimationPoints;\n+                if (animationPoints.Count > 0)\n+                {\n+                    for (var j = 0; j < points.Count; j++)\n+                    {\n+                        var animatablePoint = points[j];\n+                        if (animatablePoint != null)\n+                        {\n+                            if (j < animationPoints.Count)\n+                            {\n+                                var animationPoint = animationPoints[j];\n+\n+                                animatablePoint.X = animationPoint.X;\n+                                animatablePoint.Y = animationPoint.Y;\n+                            }\n+                        }\n+                    }\n+                }\n+\n+                plotModel.InvalidatePlot(true);\n+\n+                await Task.Delay(animationFrame.Duration);\n+            }\n+\n+            xAxis.Minimum = oldXAxisMinimum;\n+            xAxis.Maximum = oldXAxisMaximum;\n+\n+            yAxis.Minimum = oldYAxisMinimum;\n+            yAxis.Maximum = oldYAxisMaximum;\n+\n+            series.DataFieldX = previousDataFieldX;\n+            series.DataFieldY = previousDataFieldY;\n+\n+            plotModel.InvalidatePlot(true);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.linearbarseries.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.linearbarseries.cs\nnew file mode 100644\nindex 00000000..505d3a79\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.linearbarseries.cs\n@@ -0,0 +1,182 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationExtensions.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+    using OxyPlot.Series;\n+\n+    public static partial class AnimationExtensions\n+    {\n+        public static async Task AnimateSeriesAsync(\n+            this PlotModel plotModel,\n+            LinearBarSeries series,\n+            AnimationSettings settings)\n+        {\n+            var points = series.GetAnimatablePoints();\n+            if (points.Count == 0)\n+            {\n+                return;\n+            }\n+\n+            var duration = settings.Duration;\n+            if (duration == default(TimeSpan))\n+            {\n+                duration = TimeSpan.FromMilliseconds(DefaultAnimationDuration);\n+            }\n+\n+            var easingFunction = settings.EasingFunction;\n+            if (easingFunction == null)\n+            {\n+                easingFunction = DefaultEasingFunction;\n+            }\n+\n+            var animationFrameDurationInMs = (int)settings.FrameDuration.TotalMilliseconds;\n+            var minimumValue = settings.MinimumValue;\n+\n+            var animationFrames = new List<AnimationFrame>();\n+\n+            // Animation assumptions:\n+            // \n+            //   - Total duration: 300ms (in this example)\n+            //   - At least animate each horizontal value separately\n+            //   - First animate from left => right (70 % of the time)\n+            //   - Second animate from center => end (30 % of the time)\n+            // \n+            // |                                                  ^\n+            // |                                                  |\n+            // |               ___                                |\n+            // |               | |                                |  30 % of time\n+            // |   ___         | |                                |     90 ms\n+            // |   | |         | |                                |\n+            // |   | |   ___   | |                                |\n+            // |   | |   | |   | |                                |\n+            // |___|_|___|_|___|_|_____________________________   ^\n+            // \n+            // <---------------- 70 % of time ---------------->\n+            //                     (210 ms)\n+\n+            var horizontalDuration = duration.TotalMilliseconds / 100 * settings.HorizontalPercentage;\n+            var verticalDuration = duration.TotalMilliseconds / 100 * settings.VerticalPercentage;\n+\n+            var animationFrameCount = (int)(duration.TotalMilliseconds / animationFrameDurationInMs);\n+            var animationFrameDuration = TimeSpan.FromMilliseconds(animationFrameDurationInMs);\n+\n+            if (!minimumValue.HasValue)\n+            {\n+                minimumValue = 0d;\n+\n+                var defaultYAxis = plotModel.DefaultYAxis;\n+                if (defaultYAxis != null)\n+                {\n+                    if (defaultYAxis.Minimum > 0d)\n+                    {\n+                        minimumValue = defaultYAxis.Minimum;\n+                    }\n+                }\n+            }\n+\n+            var minX = (from point in points orderby point.X select point.X).Min();\n+            var maxX = (from point in points orderby point.X select point.X).Max();\n+            var deltaX = maxX - minX;\n+\n+            for (var i = 0; i < animationFrameCount; i++)\n+            {\n+                var animationFrame = new AnimationFrame\n+                {\n+                    Duration = animationFrameDuration\n+                };\n+\n+                var currentTime = animationFrameDurationInMs * i;\n+                var percentage = i * 100d / animationFrameCount;\n+\n+                var horizontalPercentage = currentTime * 100d / horizontalDuration;\n+                if (horizontalPercentage > 100d)\n+                {\n+                    horizontalPercentage = 100d;\n+                }\n+\n+                var currentDeltaX = deltaX / 100d * horizontalPercentage;\n+                var currentX = minX + currentDeltaX;\n+\n+                // Get the last visible point. It should not be based on the index (can be really different), but on the X position\n+                // since we want to draw a smooth animation\n+                var lastVisibleHorizontalPoint = 0;\n+                for (int j = 0; j < points.Count; j++)\n+                {\n+                    var x = points[j].FinalX;\n+                    if (x > currentX)\n+                    {\n+                        break;\n+                    }\n+\n+                    lastVisibleHorizontalPoint = j;\n+                }\n+\n+                for (var j = 0; j < points.Count; j++)\n+                {\n+                    var point = points[j];\n+\n+                    var isVisible = false;\n+                    var x = point.FinalX;\n+                    var y = 0d;\n+\n+                    if (j <= lastVisibleHorizontalPoint)\n+                    {\n+                        isVisible = true;\n+                        y = point.FinalY;\n+\n+                        // We know how long an y animation takes. We only have to calculate if this start time of this x animation\n+                        // is longer than verticalDuration ago\n+                        var localDeltaX = point.FinalX - minX;\n+                        var localPercentageX = localDeltaX * 100d / deltaX;\n+                        var startTime = horizontalDuration / 100 * localPercentageX;\n+                        var endTime = startTime + verticalDuration;\n+\n+                        if (endTime > currentTime)\n+                        {\n+                            var timeDeltaTotal = endTime - startTime;\n+                            var timeDeltaCurrent = currentTime - startTime;\n+                            var subPercentage = timeDeltaCurrent * 100d / timeDeltaTotal;\n+\n+                            // This bar is part of the current animation, calculate the Y relative to 30 % of the time based on the current index\n+                            // Calculate the % that offset is based on totalTimeDelta\n+\n+                            // Calculate point to animate from\n+                            var maxY = point.FinalY;\n+                            var minY = minimumValue.Value;\n+                            var deltaY = maxY - minY;\n+\n+                            // We need to ease against percentage (between 0 and 1)\n+                            var ease = easingFunction.Ease(subPercentage / 100);\n+                            var currentDeltaY = deltaY * ease;\n+\n+                            y = minY + currentDeltaY;\n+                        }\n+                    }\n+\n+                    animationFrame.AnimationPoints.Add(new AnimationPoint\n+                    {\n+                        IsVisible = isVisible,\n+                        X = x,\n+                        Y = y\n+                    });\n+                }\n+\n+                animationFrames.Add(animationFrame);\n+            }\n+\n+            animationFrames.InsertDelayAnimationFrame(settings.Delay);\n+\n+            await plotModel.AnimateSeriesAsync(series, animationFrames);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.lineseries.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.lineseries.cs\nnew file mode 100644\nindex 00000000..bb654eb3\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Extensions/AnimationExtensions.lineseries.cs\n@@ -0,0 +1,189 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationExtensions.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+    using OxyPlot.Series;\n+\n+    public static partial class AnimationExtensions\n+    {\n+        public static async Task AnimateSeriesAsync(\n+            this PlotModel plotModel,\n+            LineSeries series,\n+            AnimationSettings settings)\n+        {\n+            var points = series.GetAnimatablePoints();\n+            if (points.Count == 0)\n+            {\n+                return;\n+            }\n+\n+            var duration = settings.Duration;\n+            if (duration == default(TimeSpan))\n+            {\n+                duration = TimeSpan.FromMilliseconds(DefaultAnimationDuration);\n+            }\n+\n+            var easingFunction = settings.EasingFunction;\n+            if (easingFunction == null)\n+            {\n+                easingFunction = DefaultEasingFunction;\n+            }\n+\n+            var animationFrameDurationInMs = (int)settings.FrameDuration.TotalMilliseconds;\n+            var minimumValue = settings.MinimumValue;\n+\n+            var animationFrames = new List<AnimationFrame>();\n+\n+            var horizontalDuration = duration.TotalMilliseconds / 100 * settings.HorizontalPercentage;\n+            var verticalDuration = duration.TotalMilliseconds / 100 * settings.VerticalPercentage;\n+\n+            var animationFrameCount = (int)(duration.TotalMilliseconds / animationFrameDurationInMs);\n+            var animationFrameDuration = TimeSpan.FromMilliseconds(animationFrameDurationInMs);\n+\n+            if (!minimumValue.HasValue)\n+            {\n+                minimumValue = 0d;\n+\n+                var defaultYAxis = plotModel.DefaultYAxis;\n+                if (defaultYAxis != null)\n+                {\n+                    if (defaultYAxis.Minimum > 0d)\n+                    {\n+                        minimumValue = defaultYAxis.Minimum;\n+                    }\n+                }\n+            }\n+\n+            var minX = (from point in points orderby point.X select point.X).Min();\n+            var maxX = (from point in points orderby point.X select point.X).Max();\n+            var deltaX = maxX - minX;\n+\n+            for (var i = 0; i < animationFrameCount; i++)\n+            {\n+                var animationFrame = new AnimationFrame\n+                {\n+                    Duration = animationFrameDuration\n+                };\n+\n+                var currentTime = animationFrameDurationInMs * i;\n+                var percentage = i * 100d / animationFrameCount;\n+\n+                var horizontalPercentage = currentTime * 100d / horizontalDuration;\n+                if (horizontalPercentage > 100d)\n+                {\n+                    horizontalPercentage = 100d;\n+                }\n+\n+                var currentDeltaX = deltaX / 100d * horizontalPercentage;\n+                var currentX = minX + currentDeltaX;\n+\n+                // Get the last visible point. It should not be based on the index (can be really different), but on the X position\n+                // since we want to draw a smooth animation\n+                var lastVisibleHorizontalPoint = 0;\n+                for (int j = 0; j < points.Count; j++)\n+                {\n+                    if (points[j].FinalX > currentX)\n+                    {\n+                        break;\n+                    }\n+\n+                    lastVisibleHorizontalPoint = j;\n+                }\n+\n+                for (var j = 0; j < points.Count; j++)\n+                {\n+                    var point = points[j];\n+\n+                    var isVisible = true;\n+                    var y = point.FinalY;\n+                    var x = point.FinalX;\n+\n+                    var nextPointIndex = lastVisibleHorizontalPoint + 1;\n+\n+                    if (j > nextPointIndex)\n+                    {\n+                        isVisible = false;\n+                    }\n+\n+                    if (j >= nextPointIndex)\n+                    {\n+                        // Calculate the position the y line is in currently (based on x1 and x2)\n+                        var previousPoint = points[lastVisibleHorizontalPoint];\n+                        var nextPoint = points[nextPointIndex];\n+\n+                        var previousX = previousPoint.FinalX;\n+                        var nextX = nextPoint.FinalX;\n+\n+                        var totalDeltaX = nextX - previousX;\n+                        var subDeltaX = currentX - previousX;\n+\n+                        var subPercentage = (subDeltaX * 100) / totalDeltaX;\n+\n+                        var previousY = previousPoint.FinalY;\n+                        var nextY = nextPoint.FinalY;\n+                        var totalDeltaY = nextY - previousY;\n+\n+                        var subDeltaY = totalDeltaY / 100 * subPercentage;\n+\n+                        y = previousY + subDeltaY;\n+                        x = currentX;\n+                    }\n+\n+                    // Calculate possible ease functions\n+                    if (j < nextPointIndex)\n+                    {\n+                        // We know how long an y animation takes. We only have to calculate if this start time of this x animation\n+                        // is longer than verticalDuration ago\n+                        var localDeltaX = point.FinalX - minX;\n+                        var localPercentageX = localDeltaX * 100d / deltaX;\n+                        var startTime = horizontalDuration / 100 * localPercentageX;\n+                        var endTime = startTime + verticalDuration;\n+                        if (endTime > currentTime)\n+                        {\n+                            var timeDeltaTotal = endTime - startTime;\n+                            var timeDeltaCurrent = currentTime - startTime;\n+                            var easePercentage = timeDeltaCurrent * 100d / timeDeltaTotal;\n+\n+                            // This bar is part of the current animation, calculate the Y relative to 30 % of the time based on the current index\n+                            // Calculate the % that offset is based on totalTimeDelta\n+\n+                            // Calculate point to animate from\n+                            var maxY = point.FinalY;\n+                            var minY = minimumValue.Value;\n+                            var deltaY = maxY - minY;\n+\n+                            // We need to ease against percentage (between 0 and 1)\n+                            var ease = easingFunction.Ease(easePercentage / 100);\n+                            var currentDeltaY = deltaY * ease;\n+\n+                            y = minY + currentDeltaY;\n+                        }\n+                    }\n+\n+                    animationFrame.AnimationPoints.Add(new AnimationPoint\n+                    {\n+                        X = x,\n+                        Y = y,\n+                        IsVisible = isVisible\n+                    });\n+                }\n+\n+                animationFrames.Add(animationFrame);\n+            }\n+\n+            animationFrames.InsertDelayAnimationFrame(settings.Delay);\n+\n+            await plotModel.AnimateSeriesAsync(series, animationFrames);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml\nindex b64c384c..2a64fb69 100644\n--- a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml\n@@ -1,26 +1,30 @@\n \ufeff<Window x:Class="AnimationsDemo.MainWindow"\n         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" \n-        xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf" \n-        Title="AnimationsDemo" Height="480" Width="640">\n+        xmlns:AnimationsDemo="clr-namespace:AnimationsDemo"\n+        Title="AnimationsDemo" Height="480" Width="740">\n \n     <Grid>\n         <Grid.RowDefinitions>\n             <RowDefinition Height="*" />\n-            <RowDefinition Height="auto" />\n+            <RowDefinition Height="Auto" />\n         </Grid.RowDefinitions>\n         \n-        <oxy:PlotView Grid.Row="0" Model="{Binding PlotModel}" />\n+        <TabControl x:Name="tabControl" Grid.Row="0">\n+            <TabItem Header="Linear Bar Series">\n+                <AnimationsDemo:LinearBarView />\n+            </TabItem>\n \n-        <StackPanel Grid.Row="1" Orientation="Horizontal">\n-            <Label Content="Easing function" VerticalAlignment="Center" Margin="6,4,6,4" />\n-            <ComboBox ItemsSource="{Binding EasingFunctions}" SelectedItem="{Binding SelectedEasingFunction}" DisplayMemberPath="Name" Margin="6,4,6,4" />\n-            \n-            <Label Content="Animation duration" VerticalAlignment="Center" Margin="6,4,6,4" />\n-            <TextBox Text="{Binding AnimationDuration}" Margin="6,4,6,4" Height="25" />\n-            \n-            <Button Content="Animate" Click="OnAnimateClick" Width="75" Margin="6,4,6,4" />\n-        </StackPanel>\n+            <TabItem Header="Line Series">\n+                <AnimationsDemo:LineSeriesView />\n+            </TabItem>\n+\n+            <TabItem Header="Area Series">\n+                <AnimationsDemo:AreaSeriesView />\n+            </TabItem>\n+        </TabControl>\n+        \n+        <AnimationsDemo:AnimationSettingsControl Grid.Row="1" DataContext="{Binding ElementName=tabControl, Path=SelectedItem.Content.DataContext}" />\n     </Grid>\n-    \n+\n </Window>\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml.cs\nindex 8cfa40ef..43efda52 100644\n--- a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml.cs\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainWindow.xaml.cs\n@@ -22,16 +22,6 @@ public partial class MainWindow : Window\n         public MainWindow()\n         {\n             this.InitializeComponent();\n-            this.DataContext = new MainViewModel();\n-        }\n-\n-        private void OnAnimateClick(object sender, RoutedEventArgs e)\n-        {\n-            var vm = DataContext as MainViewModel;\n-            if (vm != null)\n-            {\n-                vm.Animate();\n-            }\n         }\n     }\n }\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationFrame.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationFrame.cs\nnew file mode 100644\nindex 00000000..e4f3e8c7\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationFrame.cs\n@@ -0,0 +1,26 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationFrame.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+\n+    public class AnimationFrame\n+    {\n+        private static readonly TimeSpan DefaultDuration = TimeSpan.FromMilliseconds(15);\n+\n+        public AnimationFrame()\n+        {\n+            AnimationPoints = new List<AnimationPoint>();\n+            Duration = DefaultDuration;\n+        }\n+\n+        public TimeSpan Duration { get; set; }\n+\n+        public List<AnimationPoint> AnimationPoints { get; private set; }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationPoint.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationPoint.cs\nnew file mode 100644\nindex 00000000..79228073\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationPoint.cs\n@@ -0,0 +1,25 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationPoint.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System.Diagnostics;\n+\n+    [DebuggerDisplay("{X} / {Y} (IsVisible = {IsVisible})")]\n+    public class AnimationPoint\n+    {\n+        public AnimationPoint()\n+        {\n+            this.IsVisible = true;\n+        }\n+\n+        public double X { get; set; }\n+\n+        public double Y { get; set; }\n+\n+        public bool IsVisible { get; set; }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationSettings.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationSettings.cs\nnew file mode 100644\nindex 00000000..32104013\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/AnimationSettings.cs\n@@ -0,0 +1,38 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AnimationFrame.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+\n+    public class AnimationSettings\n+    {\n+        public AnimationSettings()\n+        {\n+            this.HorizontalPercentage = 70;\n+            this.VerticalPercentage = 30;\n+\n+            this.Delay = TimeSpan.FromMilliseconds(AnimationExtensions.DefaultAnimationDelay);\n+            this.Duration = TimeSpan.FromMilliseconds(AnimationExtensions.DefaultAnimationDuration);\n+            this.FrameDuration = TimeSpan.FromMilliseconds(AnimationExtensions.DefaultAnimationFrameDuration);\n+        }\n+\n+        public double? MinimumValue { get; set; }\n+\n+        public double HorizontalPercentage { get; set; }\n+\n+        public double VerticalPercentage { get; set; }\n+\n+        public TimeSpan Delay { get; set; }\n+\n+        public TimeSpan Duration { get; set; }\n+\n+        public TimeSpan FrameDuration { get; set; }\n+\n+        public IEasingFunction EasingFunction { get; set; }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Interfaces/IAnimatablePoint.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Interfaces/IAnimatablePoint.cs\nnew file mode 100644\nindex 00000000..64c6758c\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Interfaces/IAnimatablePoint.cs\n@@ -0,0 +1,20 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="IAnimatablePoint.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    public interface IAnimatablePoint\n+    {\n+        double FinalX { get; set; }\n+\n+        double FinalY { get; set; }\n+\n+        double X { get; set; }\n+\n+        double Y { get; set; }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Pnl.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Pnl.cs\nnew file mode 100644\nindex 00000000..8add9acc\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Models/Pnl.cs\n@@ -0,0 +1,50 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="Pnl.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Diagnostics;\n+\n+    using OxyPlot.Axes;\n+\n+    [DebuggerDisplay("X: {X} => {FinalX} | Y: {Y} => {FinalY}")]\n+    public class Pnl : IAnimatablePoint\n+    {\n+        public double FinalX { get; set; }\n+        public double FinalY { get; set; }\n+        public double X { get; set; }\n+        public double Y { get; set; }\n+\n+        public DateTime Time\n+        {\n+            get { return DateTimeAxis.ToDateTime(this.X); }\n+            set\n+            {\n+                var finalX = DateTimeAxis.ToDouble(value);\n+\n+                this.FinalX = finalX;\n+                this.X = finalX;\n+            }\n+        }\n+\n+        public double Value\n+        {\n+            get { return this.Y;}\n+            set\n+            {\n+                this.FinalY = value;\n+                this.Y = value;\n+            }\n+        }\n+\n+        public override string ToString()\n+        {\n+            return String.Format("{0:HH:mm} {1:0.0}", this.Time, this.Value);\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AnimationViewModelBase.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AnimationViewModelBase.cs\nnew file mode 100644\nindex 00000000..bb056bcf\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AnimationViewModelBase.cs\n@@ -0,0 +1,77 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="MainViewModel.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+\n+    public abstract class AnimationViewModelBase : IAnimationViewModel\n+    {\n+        protected AnimationViewModelBase()\n+        {\n+            this.EasingFunctions = (from type in typeof(CircleEase).Assembly.GetTypes()\n+                                    where type.GetInterfaces().Any(x => x == typeof(IEasingFunction)) && !type.IsAbstract\n+                                    orderby type.Name\n+                                    select type).ToList();\n+            this.SelectedEasingFunction = this.EasingFunctions.FirstOrDefault();\n+\n+            if (!this.SupportsEasingFunction)\n+            {\n+                this.SelectedEasingFunction = typeof(NoEase);\n+            }\n+\n+            this.AnimationDuration = 1000;\n+            this.AnimationFrameDuration = AnimationExtensions.DefaultAnimationFrameDuration;\n+            this.HorizontalPercentage = 70;\n+            this.VerticalPercentage = 30;\n+\n+            this.PlotModel = new PlotModel();\n+        }\n+\n+        public abstract bool SupportsEasingFunction { get; }\n+\n+        public PlotModel PlotModel { get; private set; }\n+\n+        public List<Type> EasingFunctions { get; private set; }\n+\n+        public Type SelectedEasingFunction { get; set; }\n+\n+        public double HorizontalPercentage { get; set; }\n+\n+        public double VerticalPercentage { get; set; }\n+\n+        public int AnimationDelay { get; set; }\n+\n+        public int AnimationDuration { get; set; }\n+\n+        public int AnimationFrameDuration { get; set; }\n+\n+        public Task AnimateAsync()\n+        {\n+            var easingFunction = (IEasingFunction)Activator.CreateInstance(this.SelectedEasingFunction);\n+\n+            var animationSettings = new AnimationSettings\n+            {\n+                EasingFunction = easingFunction,\n+                Duration = TimeSpan.FromMilliseconds(this.AnimationDuration),\n+                FrameDuration = TimeSpan.FromMilliseconds(this.AnimationFrameDuration),\n+                Delay = TimeSpan.FromMilliseconds(this.AnimationDelay),\n+                HorizontalPercentage = this.HorizontalPercentage,\n+                VerticalPercentage = this.VerticalPercentage\n+            };\n+\n+            return this.AnimateAsync(animationSettings);\n+        }\n+\n+        public abstract Task AnimateAsync(AnimationSettings animationSettings);\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AreaSeriesViewModel.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AreaSeriesViewModel.cs\nnew file mode 100644\nindex 00000000..c6fa2fc9\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/AreaSeriesViewModel.cs\n@@ -0,0 +1,98 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AreaSeriesViewModel.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+    using OxyPlot.Annotations;\n+    using OxyPlot.Axes;\n+    using OxyPlot.Series;\n+\n+    public class AreaSeriesViewModel : AnimationViewModelBase\n+    {\n+        public AreaSeriesViewModel()\n+        {\n+            var pnls = new List<Pnl>();\n+\n+            var random = new Random(31);\n+            var dateTime = DateTime.Today.Add(TimeSpan.FromHours(9));\n+            for (var pointIndex = 0; pointIndex < 50; pointIndex++)\n+            {\n+                pnls.Add(new Pnl\n+                {\n+                    Time = dateTime,\n+                    Value = -200 + random.Next(1000),\n+                });\n+                dateTime = dateTime.AddMinutes(1);\n+            }\n+\n+            var minimum = pnls.Min(x => x.Value);\n+            var maximum = pnls.Max(x => x.Value);\n+\n+            var plotModel = this.PlotModel;\n+            plotModel.Title = "Area Series Animation Demo";\n+\n+            var series = new AreaSeries\n+            {\n+                Title = "P & L",\n+                ItemsSource = pnls,\n+                DataFieldX = "Time",\n+                DataFieldY = "Value",\n+                Color = OxyColor.Parse("#4CAF50"),\n+                Fill = OxyColor.Parse("#454CAF50"),\n+                MarkerSize = 3,\n+                MarkerFill = OxyColor.Parse("#FFFFFFFF"),\n+                MarkerStroke = OxyColor.Parse("#4CAF50"),\n+                MarkerStrokeThickness = 1.5,\n+                MarkerType = MarkerType.Circle,\n+                StrokeThickness = 1,\n+            };\n+            plotModel.Series.Add(series);\n+\n+            var annotation = new LineAnnotation\n+            {\n+                Type = LineAnnotationType.Horizontal,\n+                Y = 0\n+            };\n+            plotModel.Annotations.Add(annotation);\n+\n+            var dateTimeAxis = new DateTimeAxis\n+            {\n+                Position = AxisPosition.Bottom,\n+                IntervalType = DateTimeIntervalType.Hours,\n+                IntervalLength = 50\n+            };\n+            plotModel.Axes.Add(dateTimeAxis);\n+\n+            var margin = (maximum - minimum) * 0.05;\n+\n+            var valueAxis = new LinearAxis\n+            {\n+                Position = AxisPosition.Left,\n+                Minimum = minimum - margin,\n+                Maximum = maximum + margin,\n+            };\n+            plotModel.Axes.Add(valueAxis);\n+        }\n+\n+        public override bool SupportsEasingFunction { get { return true; } }\n+\n+        public override async Task AnimateAsync(AnimationSettings animationSettings)\n+        {\n+            var plotModel = this.PlotModel;\n+            var series = plotModel.Series.First() as AreaSeries;\n+            if (series != null)\n+            {\n+                await plotModel.AnimateSeriesAsync(series, animationSettings);\n+            }\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/Interfaces/IAnimationViewModel.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/Interfaces/IAnimationViewModel.cs\nnew file mode 100644\nindex 00000000..a3fdc075\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/Interfaces/IAnimationViewModel.cs\n@@ -0,0 +1,20 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="IAnimationViewModel.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Threading.Tasks;\n+\n+    public interface IAnimationViewModel\n+    {\n+        bool SupportsEasingFunction { get; }\n+\n+        Task AnimateAsync();\n+        Task AnimateAsync(AnimationSettings animationSettings);\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LineSeriesViewModel.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LineSeriesViewModel.cs\nnew file mode 100644\nindex 00000000..f07f052d\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LineSeriesViewModel.cs\n@@ -0,0 +1,97 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="LineSeriesViewModel.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    using System;\n+    using System.Collections.Generic;\n+    using System.Linq;\n+    using System.Threading.Tasks;\n+\n+    using OxyPlot;\n+    using OxyPlot.Annotations;\n+    using OxyPlot.Axes;\n+    using OxyPlot.Series;\n+\n+    public class LineSeriesViewModel : AnimationViewModelBase\n+    {\n+        public LineSeriesViewModel()\n+        {\n+            var pnls = new List<Pnl>();\n+\n+            var random = new Random(31);\n+            var dateTime = DateTime.Today.Add(TimeSpan.FromHours(9));\n+            for (var pointIndex = 0; pointIndex < 50; pointIndex++)\n+            {\n+                pnls.Add(new Pnl\n+                {\n+                    Time = dateTime,\n+                    Value = -200 + random.Next(1000),\n+                });\n+                dateTime = dateTime.AddMinutes(1);\n+            }\n+\n+            var minimum = pnls.Min(x => x.Value);\n+            var maximum = pnls.Max(x => x.Value);\n+\n+            var plotModel = this.PlotModel;\n+            plotModel.Title = "Line Series Animation Demo";\n+\n+            var series = new LineSeries\n+            {\n+                Title = "P & L",\n+                ItemsSource = pnls,\n+                DataFieldX = "Time",\n+                DataFieldY = "Value",\n+                Color = OxyColor.Parse("#4CAF50"),\n+                MarkerSize = 3,\n+                MarkerFill = OxyColor.Parse("#FFFFFFFF"),\n+                MarkerStroke = OxyColor.Parse("#4CAF50"),\n+                MarkerStrokeThickness = 1.5,\n+                MarkerType = MarkerType.Circle,\n+                StrokeThickness = 1,\n+            };\n+            plotModel.Series.Add(series);\n+\n+            var annotation = new LineAnnotation\n+            {\n+                Type = LineAnnotationType.Horizontal,\n+                Y = 0\n+            };\n+            plotModel.Annotations.Add(annotation);\n+\n+            var dateTimeAxis = new DateTimeAxis\n+            {\n+                Position = AxisPosition.Bottom,\n+                IntervalType = DateTimeIntervalType.Hours,\n+                IntervalLength = 50\n+            };\n+            plotModel.Axes.Add(dateTimeAxis);\n+\n+            var margin = (maximum - minimum) * 0.05;\n+\n+            var valueAxis = new LinearAxis\n+            {\n+                Position = AxisPosition.Left,\n+                Minimum = minimum - margin,\n+                Maximum = maximum + margin,\n+            };\n+            plotModel.Axes.Add(valueAxis);\n+        }\n+\n+        public override bool SupportsEasingFunction { get { return true; } }\n+\n+        public override async Task AnimateAsync(AnimationSettings animationSettings)\n+        {\n+            var plotModel = this.PlotModel;\n+            var series = plotModel.Series.First() as LineSeries;\n+            if (series != null)\n+            {\n+                await plotModel.AnimateSeriesAsync(series, animationSettings);\n+            }\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainViewModel.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LinearBarViewModel.cs\nsimilarity index 62%\nrename from Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainViewModel.cs\nrename to Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LinearBarViewModel.cs\nindex 2cc48521..93258861 100644\n--- a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/MainViewModel.cs\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/ViewModels/LinearBarViewModel.cs\n@@ -9,17 +9,16 @@ namespace AnimationsDemo\n     using System;\n     using System.Collections.Generic;\n     using System.Linq;\n-    using System.Windows.Input;\n-    using System.Windows.Media.Animation;\n+    using System.Threading.Tasks;\n \n     using OxyPlot;\n     using OxyPlot.Annotations;\n     using OxyPlot.Axes;\n     using OxyPlot.Series;\n \n-    public class MainViewModel\n+    public class LinearBarViewModel : AnimationViewModelBase\n     {\n-        public MainViewModel()\n+        public LinearBarViewModel()\n         {\n             var pnls = new List<Pnl>();\n \n@@ -38,10 +37,8 @@ public MainViewModel()\n             var minimum = pnls.Min(x => x.Value);\n             var maximum = pnls.Max(x => x.Value);\n \n-            var plotModel = new PlotModel\n-            {\n-                Title = "Animations demo",\n-            };\n+            var plotModel = this.PlotModel;\n+            plotModel.Title = "Linear Bar Series Animation Demo";\n \n             var series = new LinearBarSeries\n             {\n@@ -80,45 +77,18 @@ public MainViewModel()\n                 Maximum = maximum + margin,\n             };\n             plotModel.Axes.Add(valueAxis);\n-\n-            this.EasingFunctions = (from type in typeof(CircleEase).Assembly.GetTypes()\n-                                    where typeof(EasingFunctionBase).IsAssignableFrom(type) && !type.IsAbstract\n-                                    select type).ToList();\n-            this.SelectedEasingFunction = this.EasingFunctions.FirstOrDefault();\n-\n-            this.AnimationDuration = 250;\n-            this.PlotModel = plotModel;\n-\n-            this.Animate();\n         }\n \n-        public PlotModel PlotModel { get; private set; }\n-\n-        public List<Type> EasingFunctions { get; private set; }\n-\n-        public Type SelectedEasingFunction { get; set; }\n+        public override bool SupportsEasingFunction { get { return true; } }\n \n-        public int AnimationDuration { get; set; }\n-\n-        public void Animate()\n+        public override async Task AnimateAsync(AnimationSettings animationSettings)\n         {\n             var plotModel = this.PlotModel;\n-            var series = plotModel.Series.First() as ItemsSeries;\n-\n-            var easingFunction = (EasingFunctionBase)Activator.CreateInstance(this.SelectedEasingFunction);\n-\n-            plotModel.AnimateSeries(series, easingFunction, duration: TimeSpan.FromMilliseconds(this.AnimationDuration));\n-        }\n-    }\n-\n-    public class Pnl\n-    {\n-        public DateTime Time { get; set; }\n-        public double Value { get; set; }\n-\n-        public override string ToString()\n-        {\n-            return String.Format("{0:HH:mm} {1:0.0}", this.Time, this.Value);\n+            var series = plotModel.Series.First() as LinearBarSeries;\n+            if (series != null)\n+            {\n+                await plotModel.AnimateSeriesAsync(series, animationSettings);\n+            }\n         }\n     }\n }\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml\nnew file mode 100644\nindex 00000000..695654cf\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml\n@@ -0,0 +1,13 @@\n+\ufeff<UserControl x:Class="AnimationsDemo.AreaSeriesView"\n+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" \n+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"\n+             xmlns:oxy="http://oxyplot.org/wpf"\n+             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">\n+\n+    <Grid>\n+        <oxy:PlotView Model="{Binding PlotModel}" />\n+    </Grid>\n+\n+</UserControl>\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml.cs\nnew file mode 100644\nindex 00000000..15cdab0e\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/AreaSeriesView.xaml.cs\n@@ -0,0 +1,17 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="AreaSeriesView.xaml.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    public partial class AreaSeriesView\n+    {\n+        public AreaSeriesView()\n+        {\n+            this.InitializeComponent();\n+            this.DataContext = new AreaSeriesViewModel();\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml\nnew file mode 100644\nindex 00000000..5675d0d6\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml\n@@ -0,0 +1,13 @@\n+\ufeff<UserControl x:Class="AnimationsDemo.LineSeriesView"\n+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" \n+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"\n+             xmlns:oxy="http://oxyplot.org/wpf"\n+             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">\n+\n+    <Grid>\n+        <oxy:PlotView Model="{Binding PlotModel}" />\n+    </Grid>\n+\n+</UserControl>\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml.cs\nnew file mode 100644\nindex 00000000..def9155e\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LineSeriesView.xaml.cs\n@@ -0,0 +1,17 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="LineSeriesView.xaml.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    public partial class LineSeriesView\n+    {\n+        public LineSeriesView()\n+        {\n+            this.InitializeComponent();\n+            this.DataContext = new LineSeriesViewModel();\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml\nnew file mode 100644\nindex 00000000..8b9e3c06\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml\n@@ -0,0 +1,13 @@\n+\ufeff<UserControl x:Class="AnimationsDemo.LinearBarView"\n+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"\n+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" \n+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"\n+             xmlns:oxy="http://oxyplot.org/wpf"\n+             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">\n+\n+    <Grid>\n+        <oxy:PlotView Model="{Binding PlotModel}" />\n+    </Grid>\n+\n+</UserControl>\ndiff --git a/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml.cs b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml.cs\nnew file mode 100644\nindex 00000000..5a3ebe03\n--- /dev/null\n+++ b/Source/Examples/WPF/WpfExamples/Examples/AnimationsDemo/Views/LinearBarView.xaml.cs\n@@ -0,0 +1,17 @@\n+\ufeff// --------------------------------------------------------------------------------------------------------------------\n+// <copyright file="LinearBarView.xaml.cs" company="OxyPlot">\n+//   Copyright (c) 2014 OxyPlot contributors\n+// </copyright>\n+// --------------------------------------------------------------------------------------------------------------------\n+\n+namespace AnimationsDemo\n+{\n+    public partial class LinearBarView\n+    {\n+        public LinearBarView()\n+        {\n+            this.InitializeComponent();\n+            this.DataContext = new LinearBarViewModel();\n+        }\n+    }\n+}\n\\ No newline at end of file\ndiff --git a/Source/Examples/WPF/WpfExamples/WpfExamples.csproj b/Source/Examples/WPF/WpfExamples/WpfExamples.csproj\nindex 6abb68af..41884d26 100644\n--- a/Source/Examples/WPF/WpfExamples/WpfExamples.csproj\n+++ b/Source/Examples/WPF/WpfExamples/WpfExamples.csproj\n@@ -69,8 +69,42 @@\n     <Compile Include="Examples\\AlignedAxesDemo\\MainWindow.xaml.cs">\n       <DependentUpon>MainWindow.xaml</DependentUpon>\n     </Compile>\n-    <Compile Include="Examples\\AnimationsDemo\\AnimationExtensions.cs" />\n-    <Compile Include="Examples\\AnimationsDemo\\MainViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Controls\\AnimationSettingsControl.xaml.cs">\n+      <DependentUpon>AnimationSettingsControl.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\NoEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\SineEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuinticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuarticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuadraticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\PowerEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\BounceEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\BackEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\CircleEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.datapointseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.lineseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.linearbarseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationFrame.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationPoint.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationSettings.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\Interfaces\\IAnimatablePoint.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\Pnl.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\AnimationViewModelBase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\Interfaces\\IEasingFunction.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\Interfaces\\IAnimationViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\AreaSeriesViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\LineSeriesViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\AreaSeriesView.xaml.cs">\n+      <DependentUpon>AreaSeriesView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\LineSeriesView.xaml.cs">\n+      <DependentUpon>LineSeriesView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\LinearBarView.xaml.cs">\n+      <DependentUpon>LinearBarView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\LinearBarViewModel.cs" />\n     <Compile Include="Examples\\AnimationsDemo\\MainWindow.xaml.cs">\n       <DependentUpon>MainWindow.xaml</DependentUpon>\n     </Compile>\n@@ -110,6 +144,22 @@\n       <DependentUpon>PlotViewDataTemplateWindow.xaml</DependentUpon>\n     </Compile>\n     <Compile Include="ScreenCapture.cs" />\n+    <Page Include="Examples\\AnimationsDemo\\Controls\\AnimationSettingsControl.xaml">\n+      <SubType>Designer</SubType>\n+      <Generator>MSBuild:Compile</Generator>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\AreaSeriesView.xaml">\n+      <Generator>MSBuild:Compile</Generator>\n+      <SubType>Designer</SubType>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\LineSeriesView.xaml">\n+      <Generator>MSBuild:Compile</Generator>\n+      <SubType>Designer</SubType>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\LinearBarView.xaml">\n+      <SubType>Designer</SubType>\n+      <Generator>MSBuild:Compile</Generator>\n+    </Page>\n     <Page Include="Examples\\AnimationsDemo\\MainWindow.xaml">\n       <Generator>MSBuild:Compile</Generator>\n       <SubType>Designer</SubType>\n', 'commit_subject': 'Merge pull request #782 from GeertvanHorrik/pr/improvedanimations', 'repo_name': 'oxyplot/oxyplot', 'committer': {'name': 'Oystein Bjorke', 'email': 'e3b3cb975a98d1ed93c269b3ba9f832aa4a072c7@gmail.com', 'time_sec': '1456087841', 'tz_offset': '60', 'date': {'seconds': '1456087841'}}, 'commit_tree': '2522a5b3ed48842d4a8f8f4227fb7bd3821c89c1', 'commit_message': 'Merge pull request #782 from GeertvanHorrik/pr/improvedanimations\n\nImproved the animations example so it could be used in PCL as well', 'language_name': 'C#', 'license': 'mit', 'hunks': '@@ -69,8 +69,42 @@\n     <Compile Include="Examples\\AlignedAxesDemo\\MainWindow.xaml.cs">\n       <DependentUpon>MainWindow.xaml</DependentUpon>\n     </Compile>\n-    <Compile Include="Examples\\AnimationsDemo\\AnimationExtensions.cs" />\n-    <Compile Include="Examples\\AnimationsDemo\\MainViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Controls\\AnimationSettingsControl.xaml.cs">\n+      <DependentUpon>AnimationSettingsControl.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\NoEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\SineEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuinticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuarticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\QuadraticEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\PowerEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\BounceEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\BackEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\CircleEase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.datapointseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.lineseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Extensions\\AnimationExtensions.linearbarseries.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationFrame.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationPoint.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\AnimationSettings.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\Interfaces\\IAnimatablePoint.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Models\\Pnl.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\AnimationViewModelBase.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\EasingFunctions\\Interfaces\\IEasingFunction.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\Interfaces\\IAnimationViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\AreaSeriesViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\LineSeriesViewModel.cs" />\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\AreaSeriesView.xaml.cs">\n+      <DependentUpon>AreaSeriesView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\LineSeriesView.xaml.cs">\n+      <DependentUpon>LineSeriesView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\Views\\LinearBarView.xaml.cs">\n+      <DependentUpon>LinearBarView.xaml</DependentUpon>\n+    </Compile>\n+    <Compile Include="Examples\\AnimationsDemo\\ViewModels\\LinearBarViewModel.cs" />\n     <Compile Include="Examples\\AnimationsDemo\\MainWindow.xaml.cs">\n       <DependentUpon>MainWindow.xaml</DependentUpon>\n     </Compile>\n@@ -110,6 +144,22 @@\n       <DependentUpon>PlotViewDataTemplateWindow.xaml</DependentUpon>\n     </Compile>\n     <Compile Include="ScreenCapture.cs" />\n+    <Page Include="Examples\\AnimationsDemo\\Controls\\AnimationSettingsControl.xaml">\n+      <SubType>Designer</SubType>\n+      <Generator>MSBuild:Compile</Generator>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\AreaSeriesView.xaml">\n+      <Generator>MSBuild:Compile</Generator>\n+      <SubType>Designer</SubType>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\LineSeriesView.xaml">\n+      <Generator>MSBuild:Compile</Generator>\n+      <SubType>Designer</SubType>\n+    </Page>\n+    <Page Include="Examples\\AnimationsDemo\\Views\\LinearBarView.xaml">\n+      <SubType>Designer</SubType>\n+      <Generator>MSBuild:Compile</Generator>\n+    </Page>\n     <Page Include="Examples\\AnimationsDemo\\MainWindow.xaml">\n       <Generator>MSBuild:Compile</Generator>\n       <SubType>Designer</SubType>\n', 'addition_count': 52, 'deletion_count': 2, 'src_file': 'a/Source/Examples/WPF/WpfExamples/WpfExamples.csproj', 'tgt_file': 'b/Source/Examples/WPF/WpfExamples/WpfExamples.csproj', 'file_extension': '.csproj', 'before_file': '\ufeff<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">\n  <PropertyGroup>\n      <TargetFramework>netcoreapp3.1</TargetFramework>\n      <UseWPF>true</UseWPF>\n      <UseWindowsForms>true</UseWindowsForms>\n      <OutputType>WinExe</OutputType>\n  </PropertyGroup>\n  <ItemGroup>\n    <ProjectReference Include="..\\..\\..\\OxyPlot.Wpf\\OxyPlot.Wpf.csproj" />\n    <ProjectReference Include="..\\..\\..\\OxyPlot\\OxyPlot.csproj" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include="PropertyTools.Wpf" Version="3.1.0-alpha0009" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include="ReadMe.txt" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include="..\\..\\..\\..\\Icons\\OxyPlot_64.png" Link="OxyPlot_64.png">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\gdp_per_capita_ppp.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\life_expectancy_at_birth.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\population.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\CsvDemo\\Data\\GlobalTemperatureAnomaly.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\CsvDemo\\Data\\RiverFlow.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\CsvDemo\\Data\\WorldPopulation.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Resource Include="Images\\*.png" />\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\gdp_per_capita_ppp.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\life_expectancy_at_birth.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include="Examples\\WorldStatisticsDemo\\Data\\population.csv">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include="ReadMe.txt" />\n    <Resource Include="Examples\\HistogramDemo\\hare.jpg" />\n  </ItemGroup>\n</Project>\n    <Compile Include="Examples\\AlignedAxesDemo\\MainWindow.xaml.cs">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n    </Compile>\n    <Compile Include="Examples\\AnimationsDemo\\AnimationExtensions.cs" />\n    <Compile Include="Examples\\AnimationsDemo\\MainViewModel.cs" />\n    <Compile Include="Examples\\AnimationsDemo\\MainWindow.xaml.cs">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n    </Compile>\n      <DependentUpon>PlotViewDataTemplateWindow.xaml</DependentUpon>\n    </Compile>\n    <Compile Include="ScreenCapture.cs" />\n    <Page Include="Examples\\AnimationsDemo\\MainWindow.xaml">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n', 'message': 'Merge pull request #782 from GeertvanHorrik/pr/improvedanimations\n\nImproved the animations example so it could be used in PCL as well', 'author_name': 'Oystein Bjorke', 'lang': 'csproj'}