123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
-
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Windows.Controls;
- using System.Windows.Media;
- using FWindSoft.Data;
- using FWindSoft.SystemExtensions;
- using FWindSoft.Wpf.Controls;
- namespace FWindSoft.Wpf.History
- {
- /// <summary>
- /// 控件数据保存
- /// </summary>
- public class ControlDataManager
- {
- private List<ElementValueProvider> m_ValueProviders;
- public ControlDataManager()
- {
- m_ValueProviders = new List<ElementValueProvider>();
- ValueProviders = new ReadOnlyCollection<ElementValueProvider>(m_ValueProviders);
- }
- public ControlDataManager(List<ElementValueProvider> providers) : this()
- {
- m_ValueProviders.AddRange(providers);
- }
- public ReadOnlyCollection<ElementValueProvider> ValueProviders { get; private set; }
- public void RegistValueProvider(ElementValueProvider provider)
- {
- this.m_ValueProviders.Insert(0, provider);
- }
- #region 静态方法
- /// <summary>
- /// 获取默认的provider
- /// </summary>
- /// <returns></returns>
- public static List<ElementValueProvider> GetDefaultProvider()
- {
- List<ElementValueProvider> providers = new List<ElementValueProvider>();
- providers.Add(new TextBoxValueProvider());
- providers.Add(new CheckBoxValueProvider());
- providers.Add(new ComBoxValueProvider());
- providers.Add(new ListBoxValueProvider());
- providers.Add(new RadioValueProvider());
- return providers;
- }
- #endregion
- private ElementValueProvider GetElementValueProvider(Control control)
- {
- ElementValueProvider provider = HistoryControl.GetValueAdapter(control);
- var controlType = control.GetType();
- //if (provider == null)
- //{
- // provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(controlType));
- //}
- if (provider == null)
- {
- var objectType = typeof(object);
- for (Type tempType = controlType; tempType != objectType && tempType != null; tempType = tempType.BaseType)
- {
- provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(tempType));
- if (provider!=null)
- {
- break;
- }
- }
- //provider = this.ValueProviders.FirstOrDefault(c => controlType.IsBaseType(c.RefControlType));
- }
- if (provider != null)
- {
- provider = provider.Clone();
- provider.SetAdapterControl(control);
- }
- return provider;
- }
- private IValueProvider GetValueProvider(Control control)
- {
- IValueProvider provider = null;
- do
- {
- if (control is IValueProvider)
- {
- provider = (IValueProvider)control;
- break;
- }
- provider = GetElementValueProvider(control);
- } while (false);
- return provider;
- }
- #region 公开方法
- /// <summary>
- /// 获取数据
- /// </summary>
- /// <param name="visual"></param>
- public List<ControlSaveItem> GetControlData(Visual visual)
- {
- List<ControlSaveItem> items = new List<ControlSaveItem>();
- for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
- {
- Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
- if (childVisual != null)
- {
- Control control = childVisual as Control;
- if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
- {
- var provider = GetValueProvider(control);
- if (provider != null)
- {
- var saveItem = new ControlSaveItem();
- saveItem.ControlId = control.Uid;
- saveItem.ControlName = control.Name;
- saveItem.ControlType = control.GetType().Name;
- saveItem.ControlValue = provider.GetValue().ToString();
- items.Add(saveItem);
- }
- else
- {
- items.AddRange(GetControlData(control));
- }
- }
- else
- {
- items.AddRange(GetControlData(childVisual));
- }
- }
- }
- return items;
- }
- /// <summary>
- /// 设置数据
- /// </summary>
- /// <param name="visual"></param>
- /// <param name="datas"></param>
- public void SetControlData(Visual visual, List<ControlSaveItem> datas)
- {
- for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
- {
- Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
- if (childVisual != null)
- {
- Control control = childVisual as Control;
- if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
- {
- var saveItem = datas.FirstOrDefault(s => s.ControlId == control.Uid);
- var provider = GetValueProvider(control);
- if (provider != null && saveItem != null)
- {
- provider.SetValue(saveItem.ControlValue);
- }
- else
- {
- SetControlData(childVisual, datas);
- }
- }
- else
- {
- SetControlData(childVisual, datas);
- }
- }
- }
- }
- }
- #endregion
- }
|