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();
- }
- }
- }
- }
|