如何在 c# 中使用计时器到悬停按钮

本文关键字:计时器 悬停 按钮 | 更新日期: 2023-09-27 18:30:48

我想在我的游戏中制作悬停按钮。因为当我的光标触摸按钮时,它会立即转到另一个屏幕。我不太喜欢这个。我使用xna 4.0和Visual Studio 2010来制作这个项目。(使用不带 WPF 的 Kinect)

在这种情况下如何使用计时器?请帮助我

if (Hand.contian(Button) && holdtime == targetHoldtime)
{
}

如何在 c# 中使用计时器到悬停按钮

您必须根据每帧的经过时间自行管理时间:

 ft = GameTime.Elapsed.TotalSeconds;  // Xna
 ft= 1/30f;  // 30fps

并且可以以与此类似的方式完成:

 class Button {
     public float Duration = 1; // One second
     public Rectangle Bounds;   // Button boundaries
     public float Progress { get{ return Elapsed/Duration; } }
     float Elapsed = 0;
     public void Update(float ft) {
          if (Bounds.Contains( HandPosition ))
          {
               if (Elapsed<Duration) {
                   Elapsed += ft;
                   if (Elapsed>Duration) {
                       Elapsed = Duration;
                       OnClick();
                   }
               }
          } else {
             Elapsed = 0;
          }
     }      
 }

我首先建议您浏览SDK文档和内置的KinectInteraction控件。 他们可能会为您提供所需的内容。 最值得注意的是,SDK 1.7删除了"HoverDwell"按钮,取而代之的是"按下"动作,这是手势系统中更自然的交互。 您可能希望改为使用该动作。

如果您确实想要"单击悬停"类型的操作,可以查看 SDK 1.6 中的代码以获取示例。 几个示例可在 Kinect for Windows CodePlex 存储库中在线获得。 您要查找的特定控件示例位于"BasicInteraction-WPF"项目中,称为 HoverDwellButton

"按钮"实际上是一个ContentControl这意味着您可以将任何内容放入其中以使其成为按钮。 它可以是一个简单的图像,也可以是一个复杂的Grid。 它具有在悬停上的计时器关闭时触发事件的所有钩子。

此控件具有相当多的复杂性,这使它适用于广泛的应用程序。 交互的核心是一个简单的DispatcherTimer

private void OnPreviewHandEnter(object sender, HandInputEventArgs args)
{
    if (this.trackedHandHovers.FirstOrDefault(t => t.Hand.Equals(args.Hand)) == null)
    {
        // additional logic removed for answer sanity
        var timer = new HandHoverTimer(DispatcherPriority.Normal, this.Dispatcher);
        timer.Hand = args.Hand;
        timer.Interval = TimeSpan.FromMilliseconds(Settings.Default.SelectionTime);
        timer.Tick += (o, s) => { this.InvokeHoverClick(args.Hand); };
        this.trackedHandHovers.Add(timer);
        timer.Start();
    }
    args.Handled = true;
}

请注意,Tick 事件正在调用 InvokeHoverClick ,它(部分)如下所示:

public void InvokeHoverClick(HandPosition hand)
{
    // additional logic removed for answer sanity
    var t = new DispatcherTimer();
    t.Interval = TimeSpan.FromSeconds(0.6);
    t.Tick += (o, s) =>
                  {
                      t.Stop();
                      var clickArgs = new HandInputEventArgs(HoverClickEvent, this, hand);
                      this.RaiseEvent(clickArgs);
                      this.IsSelected = false;
                  };
    t.Start();
}

现在,这会在设定的时间量后触发事件。 可以捕获此事件并根据自己的喜好进行操作。

同样,我首先建议查看 SDK 1.7 中较新的交互。 如果您仍想要定时悬停点击操作,请查看上面的链接。 我在几个不同的领域使用了HoverDwellButton,效果很好。