TemplateManager.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Media;
  10. namespace FWindSoft.Wpf.Controls
  11. {
  12. /*
  13. 模板相关类集成
  14. */
  15. /// <summary>
  16. /// 数据模板解析类
  17. /// </summary>
  18. public interface ITemplateParse
  19. {
  20. DataTemplate SelectTemplate(object ob);
  21. }
  22. /// <summary>
  23. /// 数据模板解析特性
  24. /// </summary>
  25. public class TemplateParseAttribute : Attribute
  26. {
  27. private Type m_Type;
  28. public TemplateParseAttribute(Type parseType)
  29. {
  30. if (parseType.IsAssignableFrom(typeof(ITemplateParse)))
  31. throw new ArgumentException("类型必须继承自ITemplateParse");
  32. m_Type = parseType;
  33. }
  34. /// <summary>
  35. /// 创建机械实例
  36. /// </summary>
  37. /// <returns></returns>
  38. public ITemplateParse CreateInstance()
  39. {
  40. if (m_Type == null)
  41. return null;
  42. return Activator.CreateInstance(m_Type, true) as ITemplateParse;
  43. }
  44. }
  45. /// <summary>
  46. /// 数据模板解析管理
  47. /// </summary>
  48. public class CommonTemplateProvider
  49. {
  50. public static readonly CommonTemplateProvider Default = new CommonTemplateProvider();
  51. public readonly Dictionary<Type, ITemplateParse> m_DicParse = new Dictionary<Type, ITemplateParse>();
  52. public DataTemplate DefaultTemplate { get; set; }
  53. /// <summary>
  54. /// 增加映射函数
  55. /// </summary>
  56. /// <param name="type"></param>
  57. /// <param name="parse"></param>
  58. public void Add(Type type, ITemplateParse parse)
  59. {
  60. m_DicParse[type] = parse;
  61. }
  62. /// <summary>
  63. /// 根据对象获取模板
  64. /// </summary>
  65. /// <param name="item"></param>
  66. /// <returns></returns>
  67. public virtual DataTemplate GetTemplate(object item)
  68. {
  69. ITemplateParse parse = null;
  70. DataTemplate resultTemplate = null;
  71. do
  72. {
  73. if (item == null)
  74. {
  75. break;
  76. }
  77. Type type = item as Type;
  78. if (type == null)
  79. {
  80. type = item.GetType();
  81. }
  82. if (m_DicParse.TryGetValue(type, out parse))
  83. {
  84. break;
  85. }
  86. var attributes = type.GetCustomAttributes(typeof(TemplateParseAttribute), true);
  87. if (attributes.Any())
  88. {
  89. parse = (attributes[0] as TemplateParseAttribute).CreateInstance();
  90. break;
  91. }
  92. } while (false);
  93. if (parse != null)
  94. {
  95. resultTemplate = parse.SelectTemplate(item);
  96. }
  97. return resultTemplate ?? GetDefaultTemplate(item);//如果为空,返回一个默认的模板,textblok
  98. }
  99. /// <summary>
  100. /// 根据Id获取模板
  101. /// </summary>
  102. /// <param name="templateId"></param>
  103. /// <returns></returns>
  104. public virtual DataTemplate GetTemplateByKey(string templateId)
  105. {
  106. //暂时先这么粗糙的写
  107. return GetTemplate(templateId);
  108. }
  109. /// <summary>
  110. /// 获取默认的模板
  111. /// </summary>
  112. /// <returns></returns>
  113. protected virtual DataTemplate GetDefaultTemplate(object item)
  114. {
  115. if (DefaultTemplate != null)
  116. return DefaultTemplate;
  117. DataTemplate temp = new DataTemplate();
  118. FrameworkElementFactory root = new FrameworkElementFactory(typeof(TextBox),"Part_Text");
  119. Binding binding = new Binding("Value");
  120. binding.Mode = BindingMode.TwoWay;
  121. root.SetBinding(TextBox.TextProperty, binding);
  122. //root.SetValue(TextBox.ForegroundProperty, Brushes.Red);
  123. root.SetValue(ElementCopyOptions.UseCopyProperty, true);
  124. root.SetBinding(ElementCopyOptions.CopyValueProperty, binding);
  125. temp.VisualTree = root;
  126. temp.Seal();
  127. return temp;
  128. }
  129. }
  130. }