[英]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.