Merge pull request #4320 from XAML-Knight/dev/ViewportLogging
Add Property panel for ViewportBehavior
This commit is contained in:
Коммит
3381011665
|
@ -14,7 +14,7 @@
|
|||
Height="200"
|
||||
Background="Gray">
|
||||
<interactivity:Interaction.Behaviors>
|
||||
<behaviors:ViewportBehavior x:Name="ViewportBehavior" />
|
||||
<behaviors:ViewportBehavior x:Name="ViewportBehavior" IsAlwaysOn="True" />
|
||||
</interactivity:Interaction.Behaviors>
|
||||
<Image x:Name="EffectElement"
|
||||
Width="100"
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
// Licensed to the .NET Foundation under one or more agreements.
|
||||
// The .NET Foundation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using Microsoft.Xaml.Interactivity;
|
||||
using Windows.UI.Xaml;
|
||||
|
||||
namespace Microsoft.Toolkit.Uwp.UI.Behaviors
|
||||
{
|
||||
/// <summary>
|
||||
/// A class for listening to an element enter or exit the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public partial class ViewportBehavior
|
||||
{
|
||||
/// <summary>
|
||||
/// The IsFullyInViewport value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsFullyInViewportProperty =
|
||||
DependencyProperty.Register(nameof(IsFullyInViewport), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool), OnIsFullyInViewportChanged));
|
||||
|
||||
/// <summary>
|
||||
/// The IsInViewport value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsInViewportProperty =
|
||||
DependencyProperty.Register(nameof(IsInViewport), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool), OnIsInViewportChanged));
|
||||
|
||||
/// <summary>
|
||||
/// The IsAlwaysOn value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsAlwaysOnProperty =
|
||||
DependencyProperty.Register(nameof(IsAlwaysOn), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool)));
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this behavior will remain attached after the associated element enters the viewport. When false, the behavior will remove itself after entering.
|
||||
/// </summary>
|
||||
public bool IsAlwaysOn
|
||||
{
|
||||
get { return (bool)GetValue(IsAlwaysOnProperty); }
|
||||
set { SetValue(IsAlwaysOnProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether associated element is fully in the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public bool IsFullyInViewport
|
||||
{
|
||||
get { return (bool)GetValue(IsFullyInViewportProperty); }
|
||||
private set { SetValue(IsFullyInViewportProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether associated element is in the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public bool IsInViewport
|
||||
{
|
||||
get { return (bool)GetValue(IsInViewportProperty); }
|
||||
private set { SetValue(IsInViewportProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event tracking when the object is fully within the viewport or not
|
||||
/// </summary>
|
||||
/// <param name="d">DependencyObject</param>
|
||||
/// <param name="e">EventArgs</param>
|
||||
private static void OnIsFullyInViewportChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var obj = (ViewportBehavior)d;
|
||||
var value = (bool)e.NewValue;
|
||||
|
||||
if (value)
|
||||
{
|
||||
obj.EnteredViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
|
||||
if (!obj.IsAlwaysOn)
|
||||
{
|
||||
Interaction.GetBehaviors(obj.AssociatedObject).Remove(obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.ExitingViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event tracking the state of the object as it moves into and out of the viewport
|
||||
/// </summary>
|
||||
/// <param name="d">DependencyObject</param>
|
||||
/// <param name="e">EventArgs</param>
|
||||
private static void OnIsInViewportChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var obj = (ViewportBehavior)d;
|
||||
var value = (bool)e.NewValue;
|
||||
|
||||
if (value)
|
||||
{
|
||||
obj.EnteringViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.ExitedViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,33 +12,15 @@ using Windows.UI.Xaml.Media;
|
|||
namespace Microsoft.Toolkit.Uwp.UI.Behaviors
|
||||
{
|
||||
/// <summary>
|
||||
/// A class for listening element enter or exit the ScrollViewer viewport
|
||||
/// A class for listening to an element enter or exit the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public class ViewportBehavior : BehaviorBase<FrameworkElement>
|
||||
public partial class ViewportBehavior : BehaviorBase<FrameworkElement>
|
||||
{
|
||||
/// <summary>
|
||||
/// The ScrollViewer hosting this element.
|
||||
/// </summary>
|
||||
private ScrollViewer _hostScrollViewer;
|
||||
|
||||
/// <summary>
|
||||
/// The IsFullyInViewport value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsFullyInViewportProperty =
|
||||
DependencyProperty.Register(nameof(IsFullyInViewport), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool), OnIsFullyInViewportChanged));
|
||||
|
||||
/// <summary>
|
||||
/// The IsInViewport value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsInViewportProperty =
|
||||
DependencyProperty.Register(nameof(IsInViewport), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool), OnIsInViewportChanged));
|
||||
|
||||
/// <summary>
|
||||
/// The IsAlwaysOn value of the associated element
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty IsAlwaysOnProperty =
|
||||
DependencyProperty.Register(nameof(IsAlwaysOn), typeof(bool), typeof(ViewportBehavior), new PropertyMetadata(default(bool)));
|
||||
|
||||
/// <summary>
|
||||
/// Associated element fully enter the ScrollViewer viewport event
|
||||
/// </summary>
|
||||
|
@ -59,33 +41,6 @@ namespace Microsoft.Toolkit.Uwp.UI.Behaviors
|
|||
/// </summary>
|
||||
public event EventHandler ExitingViewport;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this behavior will remain attached after the associated element enters the viewport. When false, the behavior will remove itself after entering.
|
||||
/// </summary>
|
||||
public bool IsAlwaysOn
|
||||
{
|
||||
get { return (bool)GetValue(IsAlwaysOnProperty); }
|
||||
set { SetValue(IsAlwaysOnProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether associated element is fully in the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public bool IsFullyInViewport
|
||||
{
|
||||
get { return (bool)GetValue(IsFullyInViewportProperty); }
|
||||
private set { SetValue(IsFullyInViewportProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether associated element is in the ScrollViewer viewport
|
||||
/// </summary>
|
||||
public bool IsInViewport
|
||||
{
|
||||
get { return (bool)GetValue(IsInViewportProperty); }
|
||||
private set { SetValue(IsInViewportProperty, value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called after the behavior is attached to the <see cref="P:Microsoft.Xaml.Interactivity.Behavior.AssociatedObject" />.
|
||||
/// </summary>
|
||||
|
@ -120,39 +75,6 @@ namespace Microsoft.Toolkit.Uwp.UI.Behaviors
|
|||
_hostScrollViewer = null;
|
||||
}
|
||||
|
||||
private static void OnIsFullyInViewportChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var obj = (ViewportBehavior)d;
|
||||
var value = (bool)e.NewValue;
|
||||
if (value)
|
||||
{
|
||||
obj.EnteredViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
|
||||
if (!obj.IsAlwaysOn)
|
||||
{
|
||||
Interaction.GetBehaviors(obj.AssociatedObject).Remove(obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.ExitingViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnIsInViewportChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var obj = (ViewportBehavior)d;
|
||||
var value = (bool)e.NewValue;
|
||||
if (value)
|
||||
{
|
||||
obj.EnteringViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.ExitedViewport?.Invoke(obj.AssociatedObject, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
private void ParentScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
|
||||
{
|
||||
var associatedElementRect = AssociatedObject.TransformToVisual(_hostScrollViewer)
|
||||
|
|
Загрузка…
Ссылка в новой задаче