簡體   English   中英

如何正確實現 UWP C# 的 Grid 子類?

[英]How do I properly implement a UWP C# subclass of Grid?

我正在努力將一個功能實現到 UWP 應用程序中,當一個 Grid 項懸停在 AdaptiveGridView 中時,2 秒后它將以另一個格式化的 Grid 形式顯示一個彈出窗口,其中包含有關懸停項的更多詳細信息。 在我需要在彈出窗口出現之前添加 2 秒的延遲之前,這一直工作得很好。

我一直在調整一個類似的線程以試圖使這項工作( How to use mousehover delay in c#? )但是由於一些錯誤我無法覆蓋 PointerEntered/PointerExited 函數:

第 43 行:CS0505:“HoverGrid.PointerEntered(PointerEventHandler)”:無法覆蓋,因為“UIElement.PointerEntered”不是 function

第 45 行:CS0079:事件“UIElement.PointerEntered”只能出現在 += 或 -= 的左側

老實說,我也不確定這是否是實現 hover 延遲事件的最佳方式,但我正在嘗試

目前我已經創建了一個 HoverGrid.cs class 正在接收錯誤(如下)。 我試過調整參數/方法的命名,但它似乎沒有做任何事情。

我還嘗試在包含我最終要處理的事件的頁面中直接實現計時器,但我遇到了問題,這就是我盡可能嘗試這種方法的原因。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

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 中實現)。 請原諒一些額外的變量聲明,我正在嘗試以幾種方式實現 hover function 並且尚未清理它。

using Microsoft.Toolkit.Uwp.UI;
using Microsoft.Toolkit.Uwp.UI.Controls;
using System.Diagnostics;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Core;

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)
    }
}
}

您的問題是您正在嘗試使用 function 覆蓋屬性。
因為UIElement.PointerEntered是一個Event ,所以您需要為其分配一個委托(類型為PointerEventHandler

這是一個示例片段:

// Your constructor
public HoverGrid()
{
    this.PointerEntered += HandlePointerEntered;
    // Do other setup
}

protected void HandlePointerEntered(object sender, PointerRoutedEventArgs args)
{
    // Handle somehow
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM