using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; using FWindSoft.Common; using FWindSoft.Data; using FWindSoft.Tools; using FWindSoft.Wpf.History; namespace FWindSoft.Wpf { /// /// 带历史值处理的窗体 /// public class HWindow:System.Windows.Window { protected List m_ValueProviders = new List(); public HWindow() { this.Loaded += HWindow_Loaded; InitProviders(); //加载数据需要手动,去子类调用 // LoadData(); } #region 构造onLoad事件 private void HWindow_Loaded(object sender, System.Windows.RoutedEventArgs e) { OnLoaded(e); } protected virtual void OnLoaded(System.Windows.RoutedEventArgs e) { } protected override void OnClosed(EventArgs e) { SaveData(); } #endregion protected virtual void InitProviders() { m_ValueProviders.AddRange(ControlDataManager.GetDefaultProvider()); } /// /// 记录窗体location /// public bool RecordLocation { get; set; } /// /// 历史数据可使用的 /// public bool HistoryUseable { get; set; } #region 历史之值相关模块 public StorageManager StorageManager { get; private set; } /// /// 初始化存储模块 /// private bool InitStorageManager() { if (HistoryUseable == false && RecordLocation == false) { return false; } if (StorageManager == null) { StorageManager = new StorageManager(Path.Combine(App.AppDataPath, "HWindow.dll"), new List() { typeof(ControlSaveItem), typeof(List) }); } return true; } public void LoadData() { if (!InitStorageManager()) { return; } if (HistoryUseable) { List items = TypeUtil.ConvertToList(StorageManager.LoadData(DataKey())); ControlDataManager manager = new ControlDataManager(); m_ValueProviders.ForEach(c => manager.RegistValueProvider(c)); manager.SetControlData(this, items); } if (RecordLocation) { WindowValueProvider winProvider = new WindowValueProvider(); winProvider.SetAdapterControl(this); winProvider.SetValue(StorageManager.LoadData(LocationKey())); } } public void SaveData() { if (!InitStorageManager()) { return; } if (HistoryUseable) { ControlDataManager manager = new ControlDataManager(); m_ValueProviders.ForEach(c => manager.RegistValueProvider(c)); List items = manager.GetControlData(this); StorageManager.SaveData(DataKey(), items); } if (RecordLocation) { WindowValueProvider winProvider = new WindowValueProvider(); winProvider.SetAdapterControl(this); StorageManager.SaveData(LocationKey(), winProvider.GetValue()); } } private string DataKey() { return this.GetType().FullName+"_Data"; } private string LocationKey() { //分开存储,是为了解耦序列化逻辑,将功能单元分解 return this.GetType().FullName + "_Location"; } public void RegistValueProvider(ElementValueProvider provider) { m_ValueProviders.Insert(0, provider); } #endregion } }