2

我在 windows phone 市场上有一个已发布的应用程序,我正在尝试将其移植到 Win 8。我正在使用Windows 8 Release PreviewVisual Studio Express RC 2012 for Win 8,代码是C#-XAML.

我创建了一个自定义 6x7 日历。前 7 个按钮放入第一个StackPanel,下一个放入另一个面板,依此类推。所以有6个StackPanels持有42个按钮。所有这些 StackPanel 都放在一个Grid便于定位的位置。

每个按钮都与一个Holding名为 OnLongPress 的 EventHandler 相关联。所以我面临的问题是,当按下按钮时, OnLongPress 函数被调用两次。在调试时,我发现第一次Holding stateisStarted和下一次调用它时Holding stateid Completed。我无法弄清楚为什么它被调用了两次。

是不是因为事件被冒泡了??:(

    private void OnLongPress(object sender, HoldingRoutedEventArgs e)
    {

            Button butClicked = (Button)sender;
            int iNumClicked = Convert.ToInt32(butClicked.Content.ToString());

            CycleManager pCycMan = CycleManager.Instance;

            string iVal, jVal;
            int iRow, jCol;
            string butName = butClicked.Name;
            iVal = butName.Substring(1, 1);
            jVal = butName.Substring(2, 1);
            iRow = Convert.ToInt32(iVal);
            jCol = Convert.ToInt32(jVal);

            DateTime dtSelDate = new DateTime(m_yearBuffer[iRow, jCol], m_monthBuffer[iRow, jCol], iNumClicked);

            int trackingStatus = pCycMan.IsDateOkForHistory(dtSelDate);
            // setting or resetting few colors based on few checks
    }

由于我是 Win 8 dev 的新手,如果有人能提供一些启示,那将会很有帮助。

4

2 回答 2

6

我已经解决了保持事件被调用两次的问题,一次处理状态开始,一次完成,包括以下检查。我仍然不确定这是否是正确的方法。

if (e.HoldingState == Windows.UI.Input.HoldingState.Started)
于 2012-06-07T12:47:36.100 回答
1

如果您只想让事件在保持状态完成或取消时触发一次,请尝试使用RightTapped.

保持用于信息 UI,但对于显示上下文菜单等交互,您应该使用它RightTapped。您可以先处理 Hold 以显示菜单将出现的提示,但要显示菜单本身,请使用RightTapped处理程序。有关如何在应用设计中使用保持交互的更多信息,请参阅触控交互设计或常见用户交互指南。

http://msdn.microsoft.com/en-us/library/windows.ui.xaml.uielement.holding.aspx

RightTapped触摸动作是由于处理在一个地方保留一定时间的动作而产生的。如果是触摸动作,来自同一元素的保持事件总是在此之前,但RightTapped在释放触摸点之前不会触发。如果按下指针的时间太短并且触发的是 Tapped 而不是 Hold,或者如果 Hold 动作以HoldingStateCanceled 结束,RightTapped则不会触发。

于 2014-12-14T00:48:11.473 回答