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