ControlDataManager.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.Linq;
  6. using System.Windows.Controls;
  7. using System.Windows.Media;
  8. using FWindSoft.Data;
  9. using FWindSoft.SystemExtensions;
  10. using FWindSoft.Wpf.Controls;
  11. namespace FWindSoft.Wpf.History
  12. {
  13. /// <summary>
  14. /// 控件数据保存
  15. /// </summary>
  16. public class ControlDataManager
  17. {
  18. private List<ElementValueProvider> m_ValueProviders;
  19. public ControlDataManager()
  20. {
  21. m_ValueProviders = new List<ElementValueProvider>();
  22. ValueProviders = new ReadOnlyCollection<ElementValueProvider>(m_ValueProviders);
  23. }
  24. public ControlDataManager(List<ElementValueProvider> providers) : this()
  25. {
  26. m_ValueProviders.AddRange(providers);
  27. }
  28. public ReadOnlyCollection<ElementValueProvider> ValueProviders { get; private set; }
  29. public void RegistValueProvider(ElementValueProvider provider)
  30. {
  31. this.m_ValueProviders.Insert(0, provider);
  32. }
  33. #region 静态方法
  34. /// <summary>
  35. /// 获取默认的provider
  36. /// </summary>
  37. /// <returns></returns>
  38. public static List<ElementValueProvider> GetDefaultProvider()
  39. {
  40. List<ElementValueProvider> providers = new List<ElementValueProvider>();
  41. providers.Add(new TextBoxValueProvider());
  42. providers.Add(new CheckBoxValueProvider());
  43. providers.Add(new ComBoxValueProvider());
  44. providers.Add(new ListBoxValueProvider());
  45. providers.Add(new RadioValueProvider());
  46. return providers;
  47. }
  48. #endregion
  49. private ElementValueProvider GetElementValueProvider(Control control)
  50. {
  51. ElementValueProvider provider = HistoryControl.GetValueAdapter(control);
  52. var controlType = control.GetType();
  53. //if (provider == null)
  54. //{
  55. // provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(controlType));
  56. //}
  57. if (provider == null)
  58. {
  59. var objectType = typeof(object);
  60. for (Type tempType = controlType; tempType != objectType && tempType != null; tempType = tempType.BaseType)
  61. {
  62. provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(tempType));
  63. if (provider!=null)
  64. {
  65. break;
  66. }
  67. }
  68. //provider = this.ValueProviders.FirstOrDefault(c => controlType.IsBaseType(c.RefControlType));
  69. }
  70. if (provider != null)
  71. {
  72. provider = provider.Clone();
  73. provider.SetAdapterControl(control);
  74. }
  75. return provider;
  76. }
  77. private IValueProvider GetValueProvider(Control control)
  78. {
  79. IValueProvider provider = null;
  80. do
  81. {
  82. if (control is IValueProvider)
  83. {
  84. provider = (IValueProvider)control;
  85. break;
  86. }
  87. provider = GetElementValueProvider(control);
  88. } while (false);
  89. return provider;
  90. }
  91. #region 公开方法
  92. /// <summary>
  93. /// 获取数据
  94. /// </summary>
  95. /// <param name="visual"></param>
  96. public List<ControlSaveItem> GetControlData(Visual visual)
  97. {
  98. List<ControlSaveItem> items = new List<ControlSaveItem>();
  99. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
  100. {
  101. Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
  102. if (childVisual != null)
  103. {
  104. Control control = childVisual as Control;
  105. if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
  106. {
  107. var provider = GetValueProvider(control);
  108. if (provider != null)
  109. {
  110. var saveItem = new ControlSaveItem();
  111. saveItem.ControlId = control.Uid;
  112. saveItem.ControlName = control.Name;
  113. saveItem.ControlType = control.GetType().Name;
  114. saveItem.ControlValue = provider.GetValue().ToString();
  115. items.Add(saveItem);
  116. }
  117. else
  118. {
  119. items.AddRange(GetControlData(control));
  120. }
  121. }
  122. else
  123. {
  124. items.AddRange(GetControlData(childVisual));
  125. }
  126. }
  127. }
  128. return items;
  129. }
  130. /// <summary>
  131. /// 设置数据
  132. /// </summary>
  133. /// <param name="visual"></param>
  134. /// <param name="datas"></param>
  135. public void SetControlData(Visual visual, List<ControlSaveItem> datas)
  136. {
  137. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
  138. {
  139. Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);
  140. if (childVisual != null)
  141. {
  142. Control control = childVisual as Control;
  143. if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid))
  144. {
  145. var saveItem = datas.FirstOrDefault(s => s.ControlId == control.Uid);
  146. var provider = GetValueProvider(control);
  147. if (provider != null && saveItem != null)
  148. {
  149. provider.SetValue(saveItem.ControlValue);
  150. }
  151. else
  152. {
  153. SetControlData(childVisual, datas);
  154. }
  155. }
  156. else
  157. {
  158. SetControlData(childVisual, datas);
  159. }
  160. }
  161. }
  162. }
  163. }
  164. #endregion
  165. }