123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using System;
- using System.Globalization;
- using System.Windows;
- using System.Windows.Controls.Primitives;
- using System.Windows.Media.Animation;
- using HandyControl.Data;
- namespace HandyControl.Interactivity;
- [DefaultTrigger(typeof(UIElement), typeof(EventTrigger), "MouseLeftButtonDown")]
- [DefaultTrigger(typeof(ButtonBase), typeof(EventTrigger), "Click")]
- public abstract class TriggerAction : Animatable, IAttachedObject
- {
- public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.Register("IsEnabled",
- typeof(bool), typeof(TriggerAction), new FrameworkPropertyMetadata(ValueBoxes.TrueBox));
- private readonly Type _associatedObjectTypeConstraint;
- private DependencyObject _associatedObject;
- private bool _isHosted;
- internal TriggerAction(Type associatedObjectTypeConstraint)
- {
- _associatedObjectTypeConstraint = associatedObjectTypeConstraint;
- }
- protected DependencyObject AssociatedObject
- {
- get
- {
- ReadPreamble();
- return _associatedObject;
- }
- }
- protected virtual Type AssociatedObjectTypeConstraint
- {
- get
- {
- ReadPreamble();
- return _associatedObjectTypeConstraint;
- }
- }
- public bool IsEnabled
- {
- get => (bool) GetValue(IsEnabledProperty);
- set => SetValue(IsEnabledProperty, ValueBoxes.BooleanBox(value));
- }
- internal bool IsHosted
- {
- get
- {
- ReadPreamble();
- return _isHosted;
- }
- set
- {
- WritePreamble();
- _isHosted = value;
- WritePostscript();
- }
- }
- public void Attach(DependencyObject dependencyObject)
- {
- if (!Equals(dependencyObject, AssociatedObject))
- {
- if (AssociatedObject != null)
- throw new InvalidOperationException(ExceptionStringTable
- .CannotHostTriggerActionMultipleTimesExceptionMessage);
- if (dependencyObject != null &&
- !AssociatedObjectTypeConstraint.IsInstanceOfType(dependencyObject))
- throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
- ExceptionStringTable.TypeConstraintViolatedExceptionMessage,
- new object[]
- {GetType().Name, dependencyObject.GetType().Name, AssociatedObjectTypeConstraint.Name}));
- WritePreamble();
- _associatedObject = dependencyObject;
- WritePostscript();
- OnAttached();
- }
- }
- public void Detach()
- {
- OnDetaching();
- WritePreamble();
- _associatedObject = null;
- WritePostscript();
- }
- DependencyObject IAttachedObject.AssociatedObject =>
- AssociatedObject;
- internal void CallInvoke(object parameter)
- {
- if (IsEnabled)
- Invoke(parameter);
- }
- protected override Freezable CreateInstanceCore()
- {
- return (Freezable) Activator.CreateInstance(GetType());
- }
- protected abstract void Invoke(object parameter);
- protected virtual void OnAttached()
- {
- }
- protected virtual void OnDetaching()
- {
- }
- }
|