5

对于我的应用程序,我想使用所有内置的操作可能性,例如缩放。但是如果用户在屏幕上按下 3 个手指,我想显示一个特定的 UI 元素。那么检查用户是否在屏幕上同时按下了 3 个手指并且彼此相邻的最佳方法是什么?(不禁用内置的操作可能性)。

我的第一种方法是在布局的顶部 Grid 元素上注册 TouchDown 事件。在事件处理程序中,我得到了联系。但是在那里做什么呢?

只需检查联系人是否是指纹,将其存储在列表中,然后检查列表是否已经包含两个相似的联系人?

还是有更性感的解决方案?

谢谢!

编辑:

按照答案,我写了两种方法:

private void OnContactDown(object sender, ContactEventArgs e)
        {
            if (this.ContactsOver.Count == 3)
            {
                Console.WriteLine("3 contacts down. Check proximity");

                if (areNear(this.ContactsOver))
                {
                    Console.WriteLine("3 fingers down!");
                }
            }
        }

        private Boolean areNear(ReadOnlyContactCollection contacts)
        {
            if ( Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(1).GetCenterPosition(this).X) < 100 &&
                 Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(1).GetCenterPosition(this).Y) < 100 &&
                 Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
                 Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100 &&
                 Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 &&
                 Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

它们必须重写,但它有效。并且必须调整阈值(atm 100)。

4

1 回答 1

2

所有表面控件上都有一个属性,其中包含其上的接触数。属性是 ContactsOver 或它的任何变体,具体取决于您的需要,请参阅http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx

例如,您可以在 ContactDown 事件处理程序中检查该属性的 Count 值。要检查它们的距离,只需对它们执行 GetPosition 并在点上使用基本矢量数学。

于 2010-11-14T13:35:50.460 回答