mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-21 17:44:43 +01:00
Pushing missing changes
This commit is contained in:
147
MediaBrowser.UI.Controls/TransitionControl.cs
Normal file
147
MediaBrowser.UI.Controls/TransitionControl.cs
Normal file
@@ -0,0 +1,147 @@
|
||||
using Microsoft.Expression.Media.Effects;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
|
||||
namespace MediaBrowser.UI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// http://victorcher.blogspot.com/2012/02/wpf-transactions.html
|
||||
/// </summary>
|
||||
public class TransitionControl : ContentControl
|
||||
{
|
||||
/// <summary>
|
||||
/// The _content presenter
|
||||
/// </summary>
|
||||
private ContentPresenter _contentPresenter;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes static members of the <see cref="TransitionControl" /> class.
|
||||
/// </summary>
|
||||
static TransitionControl()
|
||||
{
|
||||
DefaultStyleKeyProperty.OverrideMetadata(
|
||||
typeof(TransitionControl), new FrameworkPropertyMetadata(typeof(TransitionControl)));
|
||||
|
||||
ContentProperty.OverrideMetadata(
|
||||
typeof(TransitionControl), new FrameworkPropertyMetadata(OnContentPropertyChanged));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate" />.
|
||||
/// </summary>
|
||||
public override void OnApplyTemplate()
|
||||
{
|
||||
base.OnApplyTemplate();
|
||||
_contentPresenter = (ContentPresenter)Template.FindName("ContentPresenter", this);
|
||||
}
|
||||
|
||||
#region DP TransitionType
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the type of the transition.
|
||||
/// </summary>
|
||||
/// <value>The type of the transition.</value>
|
||||
public TransitionEffect TransitionType
|
||||
{
|
||||
get { return (TransitionEffect)GetValue(TransitionTypeProperty); }
|
||||
set { SetValue(TransitionTypeProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for TransitionType. This enables animation, styling, binding, etc...
|
||||
/// <summary>
|
||||
/// The transition type property
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty TransitionTypeProperty =
|
||||
DependencyProperty.Register("TransitionType", typeof(TransitionEffect), typeof(TransitionControl),
|
||||
new UIPropertyMetadata(new BlindsTransitionEffect()));
|
||||
|
||||
#endregion DP TransitionType
|
||||
|
||||
#region DP Transition Animation
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the transition animation.
|
||||
/// </summary>
|
||||
/// <value>The transition animation.</value>
|
||||
public DoubleAnimation TransitionAnimation
|
||||
{
|
||||
get { return (DoubleAnimation)GetValue(TransitionAnimationProperty); }
|
||||
set { SetValue(TransitionAnimationProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for TransitionAnimation. This enables animation, styling, binding, etc...
|
||||
/// <summary>
|
||||
/// The transition animation property
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty TransitionAnimationProperty =
|
||||
DependencyProperty.Register("TransitionAnimation", typeof(DoubleAnimation), typeof(TransitionControl), new UIPropertyMetadata(null));
|
||||
|
||||
#endregion DP Transition Animation
|
||||
|
||||
/// <summary>
|
||||
/// Called when [content property changed].
|
||||
/// </summary>
|
||||
/// <param name="dp">The dp.</param>
|
||||
/// <param name="args">The <see cref="DependencyPropertyChangedEventArgs" /> instance containing the event data.</param>
|
||||
private static void OnContentPropertyChanged(DependencyObject dp, DependencyPropertyChangedEventArgs args)
|
||||
{
|
||||
var oldContent = args.OldValue;
|
||||
var newContent = args.NewValue;
|
||||
|
||||
var transitionControl = (TransitionControl)dp;
|
||||
|
||||
if (DesignerProperties.GetIsInDesignMode(transitionControl))
|
||||
return;
|
||||
|
||||
if (oldContent != null && newContent != null && transitionControl.IsVisible)
|
||||
{
|
||||
transitionControl.AnimateContent(oldContent, newContent);
|
||||
}
|
||||
else if (newContent != null)
|
||||
{
|
||||
transitionControl.Content = newContent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Animates the content.
|
||||
/// </summary>
|
||||
/// <param name="oldContent">The old content.</param>
|
||||
/// <param name="newContent">The new content.</param>
|
||||
private void AnimateContent(object oldContent, object newContent)
|
||||
{
|
||||
FrameworkElement oldContentVisual;
|
||||
|
||||
try
|
||||
{
|
||||
oldContentVisual = VisualTreeHelper.GetChild(_contentPresenter, 0) as FrameworkElement;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var transitionEffect = TransitionType;
|
||||
|
||||
if (transitionEffect == null)
|
||||
{
|
||||
_contentPresenter.Content = newContent;
|
||||
return;
|
||||
}
|
||||
|
||||
var da = TransitionAnimation;
|
||||
da.From = 0;
|
||||
da.To = 1;
|
||||
da.FillBehavior = FillBehavior.HoldEnd;
|
||||
|
||||
transitionEffect.OldImage = new VisualBrush(oldContentVisual);
|
||||
transitionEffect.BeginAnimation(TransitionEffect.ProgressProperty, da);
|
||||
|
||||
_contentPresenter.Effect = transitionEffect;
|
||||
_contentPresenter.Content = newContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user