如何正确实现带延迟Hover效果的UWP C# Grid子类?
实现UWP AdaptiveGridView项延迟悬停弹窗的问题
我正在为UWP应用实现功能:当AdaptiveGridView中的Grid项被悬停时,延迟2秒后显示包含该项详情的弹窗(以格式化Grid形式呈现)。原本功能正常,但添加延迟后出现问题。尝试实现延迟Hover事件时,重写PointerEntered/PointerExited函数遇到以下错误:
- Line 43: CS0505: 'HoverGrid.PointerEntered(PointerEventHandler)': 无法重写,因为 'UIElement.PointerEntered' 不是函数
- Line 45: CS0079: 事件 'UIElement.PointerEntered' 只能出现在 += 或 -= 的左侧
说实话,我不确定这是否是实现延迟Hover事件的最佳方式,但仍在尝试。目前创建了HoverGrid.cs类并出现上述错误,调整方法参数和命名也无济于事。我也曾尝试在页面后台直接实现Timer,但同样遇到问题,因此尝试此方法。
报错的HoverGrid.cs代码
namespace ViperContentManager.Classes.Controls { public class HoverGrid : Windows.UI.Xaml.Controls.Grid { protected System.Timers.Timer timer; public bool IsHoverEnabled { get; set; } public double Delay { get; set; } public event System.Timers.ElapsedEventHandler TimerElapsed { add { timer.Elapsed += value; } remove { timer.Elapsed -= value; } } public HoverGrid() { // defaults: hover trigger enabled with 3000 ms delay IsHoverEnabled = true; Delay = 3000; timer = new System.Timers.Timer { AutoReset = false, Interval = Delay }; } protected override void PointerEntered(PointerEventHandler e) { base.PointerEntered(); if (IsHoverEnabled) { timer.Start(); } } protected override void PointerExited(PointerEventHandler e) { base.PointerExited(); timer.Stop(); } } }
托管HoverGrid的页面后台代码(HoverGrid尚未在XAML中实现)
namespace MyProject.Pages { public sealed partial class ImageUploaderPage : Page { public object selected = null; public double thumbSize = 150; //Variables for on-hover popup public double detailPopLeft, detailPopRight, detailPopTop, detailPopBottom; public Rect winBounds = new Rect(0,0,0,0); public UIElement winContent = null; public Windows.UI.Xaml.Window currentWindow = null; public GeneralTransform hovTransform = null; public Point hovPointToWindow = new Point(0,0); public System.Timers.Timer hoverTimer = new System.Timers.Timer(); public object hoveredImage = null; public PointerRoutedEventArgs hoveredImageArgs = null; public ImageUploaderPage() { this.InitializeComponent(); //Create and set up the HoverTimer hoverTimer = new System.Timers.Timer(); hoverTimer.Interval = 2000; hoverTimer.Elapsed += OnTimerElapsed; hoverTimer.AutoReset = true; } //public event System.Timers.ElapsedEventHandler TimerElapsed //{ add { hoverTimer.Elapsed += value; } remove { hoverTimer.Elapsed -= value; } } private void onImageHover(object sender, PointerRoutedEventArgs e) { hoveredImage = sender; Grid img = (Grid)sender; hoveredImageArgs = e; hoverTimer.Stop(); hoverTimer.Start(); currentWindow = Window.Current; winBounds = Window.Current.Bounds; winContent = Window.Current.Content; GeneralTransform transform = img.TransformToVisual(winContent); hovPointToWindow = transform.TransformPoint(new Point(0, 0)); } private void onImageEndHover(object sender, PointerRoutedEventArgs e) { hoverTimer.Stop(); hoveredImage = null; hoveredImageArgs = null; } private void OnTimerElapsed(object source, System.Timers.ElapsedEventArgs e) { Debug.WriteLine("Timer elapsed!"); hoverTimer.Stop(); if (hoveredImage.GetType().ToString() == "Windows.UI.Xaml.Controls.Grid") { //Get the hovered image and associated arguments that were stored Grid img = (Grid)hoveredImage; PointerRoutedEventArgs f = hoveredImageArgs; //Get image position and bounds GeneralTransform transform = img.TransformToVisual(Window.Current.Content); Point coordinatePointToWindow = transform.TransformPoint(new Point(0, 0)); Rect winBounds = Window.Current.Bounds; img.Visibility = Visibility.Visible; double imgX1 = coordinatePointToWindow.X; double imgX2 = imgX1 + img.ActualWidth; double imgY1 = coordinatePointToWindow.Y; double imgY2 = imgY1 + img.ActualHeight; // (other logic here to determine pop position and display things in the UI) } } }
内容的提问来源于stack exchange,提问作者Mark L
相关产品推荐
相关产品推荐

