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 } }