【问题标题】:Windows 8 RT app control Tapped event firing multiple timesWindows 8 RT 应用程序控件多次触发事件
【发布时间】:2013-03-31 03:50:43
【问题描述】:

我有一个基本的 Image 控件,我在 XAML 中将它添加到我正在制作的控件中。然后在我正在制作的控件中的 OnApplyTemplate 方法中,向图像添加一个 Tapped 事件处理程序。

(GetTemplateChild("PART_quarter") as Image).Tapped += tcNoteSelector_Tapped;

在点击的事件处理程序中,我有以下代码:

System.Diagnostics.Debug.WriteLine("Sender: {0}", (sender as Image).Name);
e.Handled = true;

我的问题是这会触发 3 次。我有多个使用相同处理程序的图像,它们都有相同的问题。我尝试注释掉除一条事件处理程序连线之外的所有内容,但这并没有什么不同。这是应该发生的还是我做错了什么?如果这应该发生,我应该如何从事件触发的多次中确定单个逻辑点击?

【问题讨论】:

  • 开玩笑的,你的页面上碰巧有3个控件实例吗?
  • 我有 3 个图像控件,都分别命名,让我试试看评论一个是否会有所不同。
  • 不,这并没有什么不同。

标签: c# windows-runtime


【解决方案1】:

OnApplyTemplate 可以被多次调用,因此它可以多次附加您的Tap 事件处理程序。有点hacky,但是在大多数情况下删除然后添加事件处理程序应该可以确保事件处理程序只附加一次。

Image img = GetTemplateChild("PART_quarter") as Image;
if(img != null)
{
   img.Tapped -= tcNoteSelector_Tapped;
   img.Tapped += tcNoteSelector_Tapped;
}

【讨论】:

  • 就是这样。我在 OnApplyTemplate 方法中添加了一个调试行,它打印的次数与我的事件处理程序调试语句相同。谢谢!
  • 这似乎是问题的原因,但我实际上无法解决它。我尝试使用这种方法,但没有奏效。我什至尝试使用一些锁定等来确保它不是同时运行的线程。想法?
  • @BlargleMonster - 它仍然无法正常工作吗?如果没有,这里有一个与属性类似的方法。可能正在尝试stackoverflow.com/questions/7971683/…
  • 这是最奇怪的事情,我在上面的问题中添加了多个调试行和锁定,它仍然多次写入输出。然而,当我从事件处理程序中引发另一个事件时,我注册的事件似乎只发生了一次。所以我不确定我是疯了还是有点半毛病。看来我可以通过使用你的建议让它发挥作用,但这对我来说已经足够了。
  • OnApplyTemplate 事件仍被多次调用,这就是您的调试输出多次写入的原因。与事件处理程序的不同之处在于您将其删除然后重新附加,因此当最后一次调用OnApplyTemplate 时,它最终会附加一个事件处理程序。然而,那段分离/附加代码仍然被调用与您的调试代码相同的次数,这就是为什么在没有分离的情况下,您的原始 Tap 事件会被多次调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多