diff --git a/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml b/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml
new file mode 100644
index 0000000..e00732c
--- /dev/null
+++ b/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total electricity consumption of Galaxy SOHO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Last 12 hours average Electricity Consumption
+
+
+ kWh
+
+
+
+
+
diff --git a/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml.cs b/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml.cs
new file mode 100644
index 0000000..428cb0d
--- /dev/null
+++ b/LC_Tutorial/Tutorial/AdvancedPlots/MaterialDesignWindow.xaml.cs
@@ -0,0 +1,196 @@
+using LiveCharts;
+using LiveCharts.Defaults;
+using LiveCharts.Wpf;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Tutorial.AdvancedPlots
+{
+ ///
+ /// MaterialDesignWindow.xaml에 대한 상호 작용 논리
+ ///
+ public partial class MaterialDesignWindow : Window, INotifyPropertyChanged
+ {
+ private double _trend;
+
+ private double _lastLecture;
+ private DateTime _nowDate;
+ private double _timePowerAverage;
+
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ public SeriesCollection LastHourSeries { get; set; }
+ public SeriesCollection TimePowerSeries { get; set; }
+
+ public double LastLecture
+ {
+ get { return _lastLecture; }
+ set
+ {
+ _lastLecture = value;
+ OnPropertyChanged(nameof(LastLecture));
+ }
+ }
+
+ public DateTime NowDate
+ {
+ get { return _nowDate; }
+ set
+ {
+ _nowDate = value;
+ OnPropertyChanged(nameof(NowDate));
+ }
+ }
+
+ public double TimePowerAverage
+ {
+ get { return _timePowerAverage; }
+ set
+ {
+ _timePowerAverage = value;
+ OnPropertyChanged(nameof(TimePowerAverage));
+ }
+ }
+
+ public MaterialDesignWindow()
+ {
+ InitializeComponent();
+ InitInstance();
+ }
+
+ protected virtual void InitInstance()
+ {
+ LastHourSeries = new SeriesCollection()
+ {
+ new LineSeries()
+ {
+ AreaLimit = -10,
+ Values = new ChartValues()
+ {
+ new ObservableValue(3),
+ new ObservableValue(5),
+ new ObservableValue(6),
+ new ObservableValue(7),
+ new ObservableValue(3),
+ new ObservableValue(4),
+ new ObservableValue(2),
+ new ObservableValue(5),
+ new ObservableValue(8),
+ new ObservableValue(3),
+ new ObservableValue(5),
+ new ObservableValue(6),
+ new ObservableValue(7),
+ new ObservableValue(3),
+ new ObservableValue(4),
+ new ObservableValue(2),
+ new ObservableValue(5),
+ new ObservableValue(8)
+ }
+ }
+ };
+
+ _trend = 8;
+
+ TimePowerSeries = new SeriesCollection
+ {
+ new ColumnSeries()
+ {
+ Values = new ChartValues()
+ {
+ new ObservableValue(5),
+ new ObservableValue(9),
+ new ObservableValue(8),
+ new ObservableValue(6),
+ new ObservableValue(1),
+ new ObservableValue(5),
+ new ObservableValue(7),
+ new ObservableValue(3),
+ new ObservableValue(6),
+ new ObservableValue(3)
+ }
+ }
+ };
+
+ TimePowerAverage = GetTimePowerAverage();
+
+ Task.Run(() =>
+ {
+ Random rand = new Random();
+ while (true)
+ {
+ Thread.Sleep(500);
+ _trend += (rand.NextDouble() > 0.3 ? 1 : -1) * rand.Next(0, 5);
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ LastHourSeries[0].Values.Add(new ObservableValue(_trend));
+ LastHourSeries[0].Values.RemoveAt(0);
+ SetLecture();
+ });
+
+ int lastPower = rand.Next(1, 11);
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ TimePowerSeries[0].Values.Add(new ObservableValue(lastPower));
+ TimePowerSeries[0].Values.RemoveAt(0);
+ TimePowerAverage = GetTimePowerAverage();
+ NowDate = DateTime.Now;
+ });
+ }
+ });
+
+ DataContext = this;
+ }
+
+ private void SetLecture()
+ {
+ var target = ((ChartValues)LastHourSeries[0].Values).Last().Value;
+ var step = (target - _lastLecture) / 4;
+
+ Task.Run(() =>
+ {
+ for (int i = 0; i < 4; i++)
+ {
+ Thread.Sleep(100);
+ LastLecture += step;
+ }
+
+ LastLecture = target;
+ });
+ }
+
+ private double GetTimePowerAverage()
+ {
+ double sum = 0d;
+ foreach (var value in TimePowerSeries[0].Values.Cast())
+ {
+ sum += value.Value;
+ }
+
+ return sum / (double)TimePowerSeries[0].Values.Count;
+ }
+
+ protected virtual void OnPropertyChanged(string propertyName = null)
+ {
+ if (PropertyChanged != null)
+ PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ private void btnUpdate_Click(object sender, RoutedEventArgs e)
+ {
+ TimePowerChart.Update(true, true);
+ }
+ }
+}
diff --git a/LC_Tutorial/Tutorial/MainWindow.xaml b/LC_Tutorial/Tutorial/MainWindow.xaml
index 9df0dc6..30f6357 100644
--- a/LC_Tutorial/Tutorial/MainWindow.xaml
+++ b/LC_Tutorial/Tutorial/MainWindow.xaml
@@ -5,31 +5,41 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Tutorial"
mc:Ignorable="d"
- Title="MainWindow" Height="500" Width="800">
+ Title="MainWindow" Height="400" Width="400">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LC_Tutorial/Tutorial/MainWindow.xaml.cs b/LC_Tutorial/Tutorial/MainWindow.xaml.cs
index c0e1e67..db69b08 100644
--- a/LC_Tutorial/Tutorial/MainWindow.xaml.cs
+++ b/LC_Tutorial/Tutorial/MainWindow.xaml.cs
@@ -12,6 +12,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using Tutorial.AdvancedPlots;
using Tutorial.BasicPlots;
namespace Tutorial
@@ -115,5 +116,11 @@ namespace Tutorial
GeoMapWindow win = new GeoMapWindow();
win.Show();
}
+
+ private void btnMaterialDesign_Click(object sender, RoutedEventArgs e)
+ {
+ MaterialDesignWindow win = new MaterialDesignWindow();
+ win.Show();
+ }
}
}