using NPOI.SS.Formula.Functions;
using Prism.Events;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
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.Navigation;
using System.Windows.Shapes;
using TeamAAS_VP.Events;
namespace TeamAAS_VP.Controls
{
///
/// UProgressBar.xaml 的交互逻辑
///
public partial class UProgressBar : UserControl, IDialogAware, INotifyPropertyChanged
{
public struct ProgressParameter
{
public double Maximum;
public double Minimum;
public string SubTitle;
public string Message;
public double Value;
}
IEventAggregator eventAggregator;
#region 属性
private double maximum = 100;
///
/// 进度最大值
///
public double Maximum
{
get { return maximum; }
set { SetProperty(ref maximum, value); }
}
private double minimum = 0;
///
/// 进度最小值
///
public double Minimum
{
get { return minimum; }
set { SetProperty(ref minimum, value); }
}
private double _value = 0;
///
/// 进度当前值
///
public double Value
{
get { return _value; }
set { SetProperty(ref _value, value); }
}
private string subTitle = "";
///
/// 副标题
///
public string SubTitle
{
get { return subTitle; }
set { SetProperty(ref subTitle, value); }
}
private string message = "";
///
/// 信息
///
public string Message
{
get { return message; }
set { SetProperty(ref message, value); }
}
public string Title => "";
#endregion
#region 命令
#endregion
#region 事件
public event Action RequestClose;
#endregion
public UProgressBar(IEventAggregator ea)
{
eventAggregator = ea;
InitializeComponent();
DataContext = this;
eventAggregator.GetEvent().Subscribe(progressChanged);
}
#region 方法
private void progressChanged(ProgressParameter obj)
{
if (obj.Value < obj.Minimum)
{
CloseDialog("True");
}
else
{
App.Current.Dispatcher.BeginInvoke(new Action(() => {
Minimum = obj.Minimum;
Maximum = obj.Maximum;
SubTitle = obj.SubTitle;
Message = obj.Message;
Value = obj.Value;
}));
}
}
protected virtual void CloseDialog(string parameter)
{
ButtonResult result = ButtonResult.None;
if (parameter?.ToLower() == "true")
result = ButtonResult.OK;
else if (parameter?.ToLower() == "false")
result = ButtonResult.Cancel;
RaiseRequestClose(new DialogResult(result));
}
public virtual void RaiseRequestClose(IDialogResult dialogResult)
{
RequestClose?.Invoke(dialogResult);
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
public void OnDialogOpened(IDialogParameters parameters)
{
}
#endregion
#region 属性通知
///
/// Occurs when a property value changes.
///
public event PropertyChangedEventHandler PropertyChanged;
///
/// Checks if a property already matches a desired value. Sets the property and
/// notifies listeners only when necessary.
///
/// Type of the property.
/// Reference to a property with both getter and setter.
/// Desired value for the property.
/// Name of the property used to notify listeners. This
/// value is optional and can be provided automatically when invoked from compilers that
/// support CallerMemberName.
/// True if the value was changed, false if the existing value matched the
/// desired value.
protected virtual bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer.Default.Equals(storage, value)) return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
///
/// Checks if a property already matches a desired value. Sets the property and
/// notifies listeners only when necessary.
///
/// Type of the property.
/// Reference to a property with both getter and setter.
/// Desired value for the property.
/// Name of the property used to notify listeners. This
/// value is optional and can be provided automatically when invoked from compilers that
/// support CallerMemberName.
/// Action that is called after the property value has been changed.
/// True if the value was changed, false if the existing value matched the
/// desired value.
protected virtual bool SetProperty(ref T storage, T value, Action onChanged, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer.Default.Equals(storage, value)) return false;
storage = value;
onChanged?.Invoke();
RaisePropertyChanged(propertyName);
return true;
}
///
/// Raises this object's PropertyChanged event.
///
/// Name of the property used to notify listeners. This
/// value is optional and can be provided automatically when invoked from compilers
/// that support .
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
///
/// Raises this object's PropertyChanged event.
///
/// The PropertyChangedEventArgs
protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
{
PropertyChanged?.Invoke(this, args);
}
#endregion
}
}