Add project files.

This commit is contained in:
Daniel Clark
2022-11-01 15:26:08 +00:00
parent daa7b59f22
commit 7e4f880821
408 changed files with 16863 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
using System.Windows;
namespace TheXamlGuy.UI.WPF;
public class BindingProxy : Freezable
{
public static readonly DependencyProperty DataContextProperty =
DependencyProperty.Register(nameof(DataContext),
typeof(object), typeof(BindingProxy));
public object DataContext
{
get => GetValue(DataContextProperty);
set => SetValue(DataContextProperty, value);
}
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
+71
View File
@@ -0,0 +1,71 @@
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Windows;
using System.Windows.Data;
namespace TheXamlGuy.UI.WPF;
public class ChangePropertyExtension : TriggerExtension
{
private static readonly DependencyProperty PropertyTargetProperty =
DependencyProperty.RegisterAttached("PropertyTarget",
typeof(object), typeof(ChangePropertyExtension));
private static readonly DependencyProperty PropertyValueProperty =
DependencyProperty.RegisterAttached("PropertyValue",
typeof(object), typeof(ChangePropertyExtension));
private readonly string propertyName;
private readonly BindingBase targetBinding;
private readonly BindingBase valueBinding;
public ChangePropertyExtension(object target, string propertyName, object value)
{
this.targetBinding = target is BindingBase targetBinding ? targetBinding : target.ToBinding();
this.valueBinding = value is BindingBase valueBinding ? valueBinding : value.ToBinding();
this.propertyName = propertyName;
}
protected override void OnInvoked(object sender, EventArgs args)
{
BindingOperations.SetBinding(TargetObject, PropertyTargetProperty, targetBinding);
if (TargetObject?.GetValue(PropertyTargetProperty) is { } target)
{
Type? targetType = target.GetType();
if (targetType.GetProperty(propertyName) is PropertyInfo propertyInfo)
{
BindingOperations.SetBinding(TargetObject, PropertyValueProperty, valueBinding);
object? value = TargetObject?.GetValue(PropertyValueProperty);
TypeConverter? converter = TypeConverterHelper.GetTypeConverter(propertyInfo.PropertyType);
object? newValue = value;
if (value is not null)
{
if (converter?.CanConvertFrom(value.GetType()) == true)
{
newValue = converter.ConvertFrom(null, CultureInfo.InvariantCulture, value);
}
else
{
if (converter?.CanConvertTo(propertyInfo.PropertyType) == true)
{
newValue = converter.ConvertTo(null, CultureInfo.InvariantCulture, value, propertyInfo.PropertyType);
}
}
}
if (newValue is IEventParameter eventParameter)
{
newValue = eventParameter.GetParameters(args)[0];
}
propertyInfo?.SetValue(target, newValue, Array.Empty<object>());
}
}
}
}
+321
View File
@@ -0,0 +1,321 @@
using System.Windows.Markup;
namespace TheXamlGuy.UI.WPF;
[ContentProperty(nameof(Triggers))]
public class CompositeExtension : TriggerExtension
{
[ConstructorArgument(nameof(Triggers))]
public TriggerCollection Triggers { get; } = new TriggerCollection();
public CompositeExtension(object args0)
{
Triggers.Add(args0);
}
public CompositeExtension(object args0,
object args1)
{
Triggers.Add(args0);
Triggers.Add(args1);
}
public CompositeExtension(object args0,
object args1,
object args2)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
}
public CompositeExtension(object args0, object args1, object args2, object args3, object args4,
object args5, object args6, object args7, object args8, object args9, object args10)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
}
public CompositeExtension(object args0, object args1, object args2, object args3, object args4,
object args5, object args6, object args7, object args8, object args9, object args10, object args11)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
Triggers.Add(args11);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
Triggers.Add(args11);
Triggers.Add(args12);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
Triggers.Add(args11);
Triggers.Add(args12);
Triggers.Add(args13);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
Triggers.Add(args11);
Triggers.Add(args12);
Triggers.Add(args13);
Triggers.Add(args14);
}
public CompositeExtension(object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14,
object args15)
{
Triggers.Add(args0);
Triggers.Add(args1);
Triggers.Add(args2);
Triggers.Add(args3);
Triggers.Add(args4);
Triggers.Add(args5);
Triggers.Add(args6);
Triggers.Add(args7);
Triggers.Add(args8);
Triggers.Add(args9);
Triggers.Add(args10);
Triggers.Add(args11);
Triggers.Add(args12);
Triggers.Add(args13);
Triggers.Add(args14);
Triggers.Add(args15);
}
protected override void OnInvoked(object sender, EventArgs args)
{
foreach (TriggerExtension? trigger in Triggers)
{
trigger.Invoke(sender, args);
}
base.OnInvoked(sender, args);
}
}
+238
View File
@@ -0,0 +1,238 @@
using System.Windows;
using System.Windows.Data;
namespace TheXamlGuy.UI.WPF;
public class ConditionExtension : CompositeExtension
{
private readonly Binding conditionBinding;
private static readonly DependencyProperty ConditionProperty =
DependencyProperty.RegisterAttached("Condition",
typeof(bool), typeof(ConditionExtension));
public ConditionExtension(Binding conditionBinding,
object args0) : base(args0)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1) : base(args0, args1)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2) : base(args0, args1, args2)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3) : base(args0, args1, args2, args3)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4) : base(args0, args1, args2, args3, args4)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5) : base(args0, args1, args2, args3, args4, args5)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6) : base(args0, args1, args2, args3, args4, args5, args6)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7) : base(args0, args1, args2, args3, args4, args5, args6, args7)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10, args11)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10, args11, args12)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10, args11, args12, args13)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10, args11, args12, args13, args14)
{
this.conditionBinding = conditionBinding;
}
public ConditionExtension(Binding conditionBinding,
object args0,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14,
object args15) : base(args0, args1, args2, args3, args4, args5, args6, args7, args8, args9, args10, args11, args12, args13, args14, args15)
{
this.conditionBinding = conditionBinding;
}
protected override void OnInvoked(object sender, EventArgs args)
{
BindingOperations.SetBinding(TargetObject, ConditionProperty, conditionBinding);
if (TargetObject?.GetValue(ConditionProperty) is true)
{
base.OnInvoked(sender, args);
}
}
}
+70
View File
@@ -0,0 +1,70 @@
using System.Windows.Data;
using System.Windows.Markup;
namespace TheXamlGuy.UI.WPF;
public class EventParameterExtension : MarkupExtension, IEventParameter
{
private readonly IValueConverter? converter;
private readonly object? converterParameter;
private readonly string? key;
private readonly string? path;
public EventParameterExtension()
{
}
public EventParameterExtension(string key, string path)
{
this.key = key;
this.path = path;
}
public EventParameterExtension(string path)
{
this.path = path;
}
public EventParameterExtension(string path, IValueConverter converter)
{
this.path = path;
this.converter = converter;
}
public EventParameterExtension(string path, IValueConverter converter, object converterParameter)
{
this.path = path;
this.converter = converter;
this.converterParameter = converterParameter;
}
public List<object> GetParameters(EventArgs args)
{
List<object>? parameters = new();
dynamic? arguments = args.GetEventArguments(path, converter, converterParameter);
if (arguments is not null)
{
if (arguments is ICollection<object> collection)
{
foreach (object? argument in collection)
{
parameters.Add(key is not null ? new KeyValuePair<string, object>(key, (dynamic)argument) : argument);
}
}
else
{
parameters.Add(key is not null ? new KeyValuePair<string, object>(key, arguments) : arguments);
}
}
return parameters;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
+448
View File
@@ -0,0 +1,448 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace TheXamlGuy.UI.WPF;
public partial class InvokeExtension : TriggerExtension
{
private static readonly DependencyProperty ParameterProperty =
DependencyProperty.RegisterAttached("Parameter",
typeof(object), typeof(InvokeExtension));
private static readonly DependencyProperty TargetProperty =
DependencyProperty.RegisterAttached("Target",
typeof(object), typeof(InvokeExtension));
private readonly Dictionary<Type, Delegate?> dummyHandlers = new();
private readonly string name;
private readonly List<object> parameters = new();
private PropertyChangedRevoker? dataContextPropertyChangedRevoker;
public InvokeExtension(string name)
{
this.name = name;
}
public InvokeExtension(string name,
object args1)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
parameters.Add(args11 is MarkupExtension ? args11 : args11.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
parameters.Add(args11 is MarkupExtension ? args11 : args11.ToBinding());
parameters.Add(args12 is MarkupExtension ? args12 : args12.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
parameters.Add(args11 is MarkupExtension ? args11 : args11.ToBinding());
parameters.Add(args12 is MarkupExtension ? args12 : args12.ToBinding());
parameters.Add(args13 is MarkupExtension ? args13 : args13.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
parameters.Add(args11 is MarkupExtension ? args11 : args11.ToBinding());
parameters.Add(args12 is MarkupExtension ? args12 : args12.ToBinding());
parameters.Add(args13 is MarkupExtension ? args13 : args13.ToBinding());
parameters.Add(args14 is MarkupExtension ? args14 : args14.ToBinding());
}
public InvokeExtension(string name,
object args1,
object args2,
object args3,
object args4,
object args5,
object args6,
object args7,
object args8,
object args9,
object args10,
object args11,
object args12,
object args13,
object args14,
object args15)
{
this.name = name;
parameters.Add(args1 is MarkupExtension ? args1 : args1.ToBinding());
parameters.Add(args2 is MarkupExtension ? args2 : args2.ToBinding());
parameters.Add(args3 is MarkupExtension ? args3 : args3.ToBinding());
parameters.Add(args4 is MarkupExtension ? args4 : args4.ToBinding());
parameters.Add(args5 is MarkupExtension ? args5 : args5.ToBinding());
parameters.Add(args6 is MarkupExtension ? args6 : args6.ToBinding());
parameters.Add(args7 is MarkupExtension ? args7 : args7.ToBinding());
parameters.Add(args8 is MarkupExtension ? args8 : args8.ToBinding());
parameters.Add(args9 is MarkupExtension ? args9 : args9.ToBinding());
parameters.Add(args10 is MarkupExtension ? args10 : args10.ToBinding());
parameters.Add(args11 is MarkupExtension ? args11 : args11.ToBinding());
parameters.Add(args12 is MarkupExtension ? args12 : args12.ToBinding());
parameters.Add(args13 is MarkupExtension ? args13 : args13.ToBinding());
parameters.Add(args14 is MarkupExtension ? args14 : args14.ToBinding());
parameters.Add(args15 is MarkupExtension ? args15 : args15.ToBinding());
}
public Binding? BindingTarget { get; set; }
protected override void OnInvoked(object sender, EventArgs args)
{
if (sender is DependencyObject dependencyObject)
{
if (!TryGetDataContext(dependencyObject, out object dataContext))
{
dataContextPropertyChangedRevoker = new PropertyChangedRevoker(dependencyObject, FrameworkElement.DataContextProperty, OnDataContextPropertyChangedChanged);
void OnDataContextPropertyChangedChanged(object sender, DependencyPropertyChangedEventArgs _)
{
if (TryGetDataContext(dependencyObject, out dataContext))
{
dataContextPropertyChangedRevoker?.Dispose();
CreaterHandler(dependencyObject, args, dataContext);
}
}
}
else
{
CreaterHandler(dependencyObject, args, dataContext);
}
}
}
private bool TryGetInvoke(DependencyObject sender, object dataContext, [AllowNull]out MethodInfo? methodInfo)
{
methodInfo = null;
if (dataContext.GetType().GetMethod(name, BindingFlags.Public | BindingFlags.Instance) is MethodInfo dataContextMethodInfo)
{
methodInfo = dataContextMethodInfo;
return true;
}
if (sender.GetType().GetMethod(name, BindingFlags.Public | BindingFlags.Instance) is MethodInfo senderMethodInfo)
{
methodInfo = senderMethodInfo;
return true;
}
return false;
}
private void CreaterHandler(DependencyObject sender, EventArgs args, object dataContext)
{
if (TryGetInvoke(sender, dataContext, out MethodInfo? methodInfo))
{
ParameterInfo[] parameterInfo = methodInfo!.GetParameters();
List<object> parameters = new();
foreach (object? parameter in this.parameters)
{
switch (parameter)
{
case IParameter keyedParameter:
BindingOperations.SetBinding(sender, ParameterProperty, parameter.ToBinding());
parameters.Add(new KeyValuePair<string, object>(keyedParameter.Key, (dynamic)sender.GetValue(ParameterProperty)));
break;
case IEventParameter eventParameter:
parameters.AddRange(eventParameter.GetParameters(args));
break;
default:
BindingOperations.SetBinding(sender, ParameterProperty, parameter.ToBinding());
parameters.Add((dynamic)sender.GetValue(ParameterProperty));
break;
}
}
if (methodInfo is { })
{
methodInfo.Invoke(dataContext, parameters.Any() ? parameters.ToArray() : parameterInfo.Length > 0 ? new object?[] { null } : Array.Empty<object>());
}
}
}
private bool TryGetDataContext(DependencyObject sender, out object dataContext)
{
if (BindingTarget is not null)
{
BindingOperations.SetBinding(sender, TargetProperty, BindingTarget);
dataContext = sender.GetValue(TargetProperty);
}
else
{
dataContext = sender.GetValue(FrameworkElement.DataContextProperty) ?? sender.GetValue(FrameworkContentElement.DataContextProperty);
}
return dataContext is not null;
}
}
+18
View File
@@ -0,0 +1,18 @@
using System.Windows.Data;
namespace TheXamlGuy.UI.WPF;
public class ParameterExtension : Binding, IParameter
{
public ParameterExtension(string key)
{
Key = key;
}
public ParameterExtension(string key, string path) : base(path)
{
Key = key;
}
public string? Key { get; }
}
+38
View File
@@ -0,0 +1,38 @@
using System.Windows;
using System.Windows.Data;
namespace TheXamlGuy.UI.WPF;
public class StateExtension : TriggerExtension
{
private static readonly DependencyProperty PropertyTargetProperty =
DependencyProperty.RegisterAttached("PropertyTarget",
typeof(object), typeof(StateExtension));
private static readonly DependencyProperty StateProperty =
DependencyProperty.RegisterAttached("State",
typeof(object), typeof(StateExtension));
private readonly BindingBase targetBinding;
private readonly BindingBase stateBinding;
public StateExtension(object target, object state)
{
this.targetBinding = target is BindingBase targetBinding ? targetBinding : target.ToBinding();
this.stateBinding = state is BindingBase stateBinding ? stateBinding : state.ToBinding();
}
protected override void OnInvoked(object sender, EventArgs args)
{
BindingOperations.SetBinding(TargetObject, PropertyTargetProperty, targetBinding);
if (TargetObject?.GetValue(PropertyTargetProperty) is FrameworkElement target)
{
BindingOperations.SetBinding(target, StateProperty, stateBinding);
object? state = target.GetValue(StateProperty);
target.ApplyTemplate();
VisualStateManager.GoToElementState(target, (string)state, true);
}
}
}
+15
View File
@@ -0,0 +1,15 @@
using System.Collections.ObjectModel;
using TheXamlGuy.UI.WPF;
namespace TheXamlGuy.UI.WPF;
public class TriggerCollection : Collection<TriggerExtension>
{
public void Add(object item)
{
if (item is TriggerExtension trigger)
{
base.Add(trigger);
}
}
}
+71
View File
@@ -0,0 +1,71 @@
using System.Reflection;
using System.Windows.Markup;
using System.Windows;
using System.Xaml;
namespace TheXamlGuy.UI.WPF;
[MarkupExtensionReturnType(typeof(Delegate))]
public class TriggerExtension : MarkupExtension
{
public DependencyObject? TargetObject { get; protected set; }
protected object? TargetInvoke { get; private set; }
public void Invoke(object sender, EventArgs args)
{
OnInvoked(sender, args);
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (serviceProvider.GetService(typeof(IProvideValueTarget)) is IProvideValueTarget target)
{
if (TargetObject is null)
{
if (target.TargetObject is DependencyObject dependencyObject)
{
TargetObject = dependencyObject;
}
else if (serviceProvider.GetService(typeof(IRootObjectProvider)) is IRootObjectProvider root)
{
TargetObject = (DependencyObject)root.RootObject;
}
}
TargetInvoke = target.TargetProperty;
MethodInfo invokeMethod = GetType().GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public)!;
if (invokeMethod is null)
{
return this;
}
switch (TargetInvoke)
{
case EventInfo info:
return Delegate.CreateDelegate(info.EventHandlerType!, this, invokeMethod);
case MethodInfo methodInfo:
{
if (methodInfo.GetParameters() is ParameterInfo[] methodParameters && methodParameters is { Length: 2 })
{
return Delegate.CreateDelegate(methodParameters[1].ParameterType, this, invokeMethod);
}
break;
}
default:
break;
}
}
return this;
}
protected virtual void OnInvoked(object sender, EventArgs args)
{
}
}