| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | using Org.BouncyCastle.Asn1.Mozilla;using System;using System.Windows;using System.Windows.Controls;namespace InABox.WPF{    public static class TemplateGenerator    {        /// <summary>        ///     Creates a data-template that uses the given delegate to create new instances.        /// </summary>        public static DataTemplate CreateDataTemplate(Func<object?> factory)        {            if (factory == null)                throw new ArgumentNullException("factory");            var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl));            frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory);            var dataTemplate = new DataTemplate(typeof(DependencyObject));            dataTemplate.VisualTree = frameworkElementFactory;            return dataTemplate;        }        /// <summary>        ///     Creates a control-template that uses the given delegate to create new instances.        /// </summary>        public static ControlTemplate CreateControlTemplate(Type controlType, Func<object?> factory)        {            if (controlType == null)                throw new ArgumentNullException("controlType");            var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl));            frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory);            var controlTemplate = new ControlTemplate(controlType);            controlTemplate.VisualTree = CreateFactory(factory);            return controlTemplate;        }        public static FrameworkElementFactory CreateFactory(Func<object?> factory)        {            if (factory == null)                throw new ArgumentNullException("factory");            var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl));            frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory);            return frameworkElementFactory;        }        private sealed class _TemplateGeneratorControl :            ContentControl        {            internal static readonly DependencyProperty FactoryProperty = DependencyProperty.Register("Factory", typeof(Func<object?>),                typeof(_TemplateGeneratorControl), new PropertyMetadata(null, _FactoryChanged));            private static void _FactoryChanged(DependencyObject instance, DependencyPropertyChangedEventArgs args)            {                var control = (_TemplateGeneratorControl)instance;                var factory = (Func<object?>)args.NewValue;                if (factory != null)                    control.Content = factory();            }        }    }}
 |