Files
HandyControl/Net40/HandyControl_Net40/Interactivity/Behavior.cs
T
2019-01-21 11:12:38 +08:00

87 lines
2.5 KiB
C#

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Media.Animation;
namespace HandyControl.Interactivity
{
public abstract class Behavior : Animatable, IAttachedObject
{
private DependencyObject _associatedObject;
private readonly Type _associatedType;
internal Behavior(Type associatedType)
{
_associatedType = associatedType;
}
protected DependencyObject AssociatedObject
{
get
{
ReadPreamble();
return _associatedObject;
}
}
protected Type AssociatedType
{
get
{
ReadPreamble();
return _associatedType;
}
}
public void Attach(DependencyObject dependencyObject)
{
if (!Equals(dependencyObject, AssociatedObject))
{
if (AssociatedObject != null)
throw new InvalidOperationException(ExceptionStringTable
.CannotHostBehaviorMultipleTimesExceptionMessage);
if (dependencyObject != null && !AssociatedType.IsInstanceOfType(dependencyObject))
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
ExceptionStringTable.TypeConstraintViolatedExceptionMessage,
new object[] {GetType().Name, dependencyObject.GetType().Name, AssociatedType.Name}));
WritePreamble();
_associatedObject = dependencyObject;
WritePostscript();
OnAssociatedObjectChanged();
OnAttached();
}
}
public void Detach()
{
OnDetaching();
WritePreamble();
_associatedObject = null;
WritePostscript();
OnAssociatedObjectChanged();
}
DependencyObject IAttachedObject.AssociatedObject =>
AssociatedObject;
internal event EventHandler AssociatedObjectChanged;
protected override Freezable CreateInstanceCore()
{
return (Freezable) Activator.CreateInstance(GetType());
}
private void OnAssociatedObjectChanged()
{
AssociatedObjectChanged?.Invoke(this, new EventArgs());
}
protected virtual void OnAttached()
{
}
protected virtual void OnDetaching()
{
}
}
}