You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现带延迟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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:20:46