using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; namespace FWindSoft.Wpf.Controls { /* 模板相关类集成 */ /// /// 数据模板解析类 /// public interface ITemplateParse { DataTemplate SelectTemplate(object ob); } /// /// 数据模板解析特性 /// public class TemplateParseAttribute : Attribute { private Type m_Type; public TemplateParseAttribute(Type parseType) { if (parseType.IsAssignableFrom(typeof(ITemplateParse))) throw new ArgumentException("类型必须继承自ITemplateParse"); m_Type = parseType; } /// /// 创建机械实例 /// /// public ITemplateParse CreateInstance() { if (m_Type == null) return null; return Activator.CreateInstance(m_Type, true) as ITemplateParse; } } /// /// 数据模板解析管理 /// public class CommonTemplateProvider { public static readonly CommonTemplateProvider Default = new CommonTemplateProvider(); public readonly Dictionary m_DicParse = new Dictionary(); public DataTemplate DefaultTemplate { get; set; } /// /// 增加映射函数 /// /// /// public void Add(Type type, ITemplateParse parse) { m_DicParse[type] = parse; } /// /// 根据对象获取模板 /// /// /// public virtual DataTemplate GetTemplate(object item) { ITemplateParse parse = null; DataTemplate resultTemplate = null; do { if (item == null) { break; } Type type = item as Type; if (type == null) { type = item.GetType(); } if (m_DicParse.TryGetValue(type, out parse)) { break; } var attributes = type.GetCustomAttributes(typeof(TemplateParseAttribute), true); if (attributes.Any()) { parse = (attributes[0] as TemplateParseAttribute).CreateInstance(); break; } } while (false); if (parse != null) { resultTemplate = parse.SelectTemplate(item); } return resultTemplate ?? GetDefaultTemplate(item);//如果为空,返回一个默认的模板,textblok } /// /// 根据Id获取模板 /// /// /// public virtual DataTemplate GetTemplateByKey(string templateId) { //暂时先这么粗糙的写 return GetTemplate(templateId); } /// /// 获取默认的模板 /// /// protected virtual DataTemplate GetDefaultTemplate(object item) { if (DefaultTemplate != null) return DefaultTemplate; DataTemplate temp = new DataTemplate(); FrameworkElementFactory root = new FrameworkElementFactory(typeof(TextBox),"Part_Text"); Binding binding = new Binding("Value"); binding.Mode = BindingMode.TwoWay; root.SetBinding(TextBox.TextProperty, binding); //root.SetValue(TextBox.ForegroundProperty, Brushes.Red); root.SetValue(ElementCopyOptions.UseCopyProperty, true); root.SetBinding(ElementCopyOptions.CopyValueProperty, binding); temp.VisualTree = root; temp.Seal(); return temp; } } }