using System.Windows.Media;
namespace HistoryView.Controls;
///
/// Interaction logic for HisProgressBar.xaml
///
public partial class HisProgressBar : UserControl
{
public HisProgressBar()
{
InitializeComponent();
}
private BarData? _current;
public BarData? CurrentData
{
get
{
lock (this)
return _current;
}
set
{
lock (this)
{
_current = value;
if (value is null)
return;
App.Current.Dispatcher.Invoke(() =>
{
for (int i = 0; i < RealtimeData.Count; i++)
{
if (i == RealtimeData.Count - 1)
{
RealtimeData[i].Value = value.Value < 3 ? 3 : value.Value;
RealtimeData[i].Bursh = value.Bursh;
break;
}
RealtimeData[i].Value = RealtimeData[i + 1].Value;
RealtimeData[i].Bursh = RealtimeData[i + 1].Bursh;
}
});
}
}
}
public int RefreshRate
{
get { return (int)GetValue(RefreshRateProperty); }
set { SetValue(RefreshRateProperty, value); }
}
public static readonly DependencyProperty RefreshRateProperty =
DependencyProperty.Register("RefreshRate", typeof(int), typeof(HisProgressBar), new PropertyMetadata(1000));
private ObservableCollection RealtimeData
{
get { return (ObservableCollection)GetValue(RealtimeDataProperty); }
set { SetValue(RealtimeDataProperty, value); }
}
public static readonly DependencyProperty RealtimeDataProperty =
DependencyProperty.Register("RealtimeData", typeof(ObservableCollection), typeof(HisProgressBar), new PropertyMetadata(new ObservableCollection()));
public double CurrentValue
{
get { return (double)GetValue(CurrentValueProperty); }
set { SetValue(CurrentValueProperty, value); }
}
public static readonly DependencyProperty CurrentValueProperty =
DependencyProperty.Register("CurrentValue", typeof(double), typeof(HisProgressBar), new PropertyMetadata(0d, PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not HisProgressBar info)
return;
//double value = Math.Round(Convert.ToDouble(e.NewValue) / info.MaxValue, 1);
lock (info)
info.CurrentData = new((double)e.NewValue, info.WarningValue, info.AlarmValue);
if (info.RealtimeData is null || info.RealtimeData.Count == 0)
{
info.RealtimeData ??= [];
var width = info.Width / 3;
for (int i = 0; i < width; i++)
info.RealtimeData.Add(new(1, info.WarningValue, info.AlarmValue));
}
}
public double MaxValue
{
get { return (double)GetValue(MaxValueProperty); }
set { SetValue(MaxValueProperty, value); }
}
public static readonly DependencyProperty MaxValueProperty =
DependencyProperty.Register("MaxValue", typeof(double), typeof(HisProgressBar), new PropertyMetadata(100d));
public double WarningValue
{
get { return (double)GetValue(WarningValueProperty); }
set { SetValue(WarningValueProperty, value); }
}
public static readonly DependencyProperty WarningValueProperty =
DependencyProperty.Register("WarningValue", typeof(double), typeof(HisProgressBar), new PropertyMetadata(25d));
public double AlarmValue
{
get { return (double)GetValue(AlarmValueProperty); }
set { SetValue(AlarmValueProperty, value); }
}
public static readonly DependencyProperty AlarmValueProperty =
DependencyProperty.Register("AlarmValue", typeof(double), typeof(HisProgressBar), new PropertyMetadata(75d));
}
public partial class BarData : ObservableObject
{
public BarData(double value, double warningValue, double alarmValue)
{
string hexString = "A0";
this.Value = value;
this.Bursh = new SolidColorBrush((Color)ColorConverter.ConvertFromString($"#{hexString}32CD32"));
if (value > alarmValue || value < warningValue)
{
this.Bursh = new SolidColorBrush((Color)ColorConverter.ConvertFromString($"#{hexString}FF4040"));
return;
}
//if (value >= warningValue)
//{
// this.Bursh = new SolidColorBrush((Color)ColorConverter.ConvertFromString($"#{hexString}FF8C00"));
// return;
//}
}
[ObservableProperty]
private double _value;
[ObservableProperty]
private SolidColorBrush _bursh;
}