Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标双击并触摸散射视图项目_C#_Wpf_Touch_Double Click_Scatterview - Fatal编程技术网

C# 鼠标双击并触摸散射视图项目

C# 鼠标双击并触摸散射视图项目,c#,wpf,touch,double-click,scatterview,C#,Wpf,Touch,Double Click,Scatterview,我开发了一个WPF4触摸应用程序,它使用了一些Microsoft Surface控件。我想在ScatterViewItem上观看鼠标双击事件。当我使用鼠标时,事件将激发,但当我使用手指时,事件将永远不会引发。为什么? 非常感谢 更新: 最后,我编写了这段代码,以在两个TouchLeave事件之间的所需时间内,在有限的rect 16px宽度和高度以及500ms上,重现一个带有TouchLeave事件的简单双击。这段代码没有经过优化,但很有效。如果您有什么意见,请不要犹豫: private bool

我开发了一个WPF4触摸应用程序,它使用了一些Microsoft Surface控件。我想在ScatterViewItem上观看鼠标双击事件。当我使用鼠标时,事件将激发,但当我使用手指时,事件将永远不会引发。为什么?

非常感谢

更新:

最后,我编写了这段代码,以在两个TouchLeave事件之间的所需时间内,在有限的rect 16px宽度和高度以及500ms上,重现一个带有TouchLeave事件的简单双击。这段代码没有经过优化,但很有效。如果您有什么意见,请不要犹豫:

private bool _doubleHasTimeAndPos = false;

private TimeSpan? _doubleTouchTime = null;
private Point? _doubleTouchPoint = null;    

private void ScatterViewItem_TouchLeave(object sender, TouchEventArgs e)
    {
        if (!this._doubleHasTimeAndPos)
        {
            this._doubleTouchTime = DateTime.Now.TimeOfDay;
            this._doubleTouchPoint = e.GetTouchPoint(this.scatterView).Position;

            this._doubleHasTimeAndPos = true;
        }
        else
        {
            if (DateTime.Now.TimeOfDay.Subtract(this._doubleTouchTime.Value).TotalMilliseconds <= 500)
            {
                Point touchPoint = e.GetTouchPoint(this.scatterView).Position;

                double xDelta = Math.Abs(this._doubleTouchPoint.Value.X - touchPoint.X);
                double yDelta = Math.Abs(this._doubleTouchPoint.Value.Y - touchPoint.Y);

                if (xDelta <= 16 && yDelta <= 16)
                {
                    // DOUBLE TAP here !
                }
            }

            this._doubleTouchTime = null;
            this._doubleTouchPoint = null;

            this._doubleHasTimeAndPos = false;
        }
    }

只是一个猜测,因为缺乏测试此代码的触摸基础设施

WPF建议对任何UIElement使用Mouse.MouseDown attached事件,然后使用MouseButtonEventArgse.ClickCount检查双击的值2

     <ScatterViewItem Mouse.MouseDown="MouseButtonEventHandler" ... />

让我知道这是否有效….

在API级别,触摸事件不会生成双击事件


此外,微软的Surface UI设计指南免责声明:我帮助编写的指南实际上强烈反对双击的概念。触摸旨在为用户提供一种更“自然”的与技术交互方式,而无需任何培训、文档记录或记忆“隐藏”功能。双击不是人类在物理世界中的一种互动,也不是任何视觉启示。因此,不适合在软件应用程序中使用。顺便说一句,苹果同意这一理念——你不会在iPhone或iPad上看到任何双击互动。

不起作用,事件从未发生过…:事实上,我认为在ScatterViewItem上没有任何鼠标事件与触摸一起工作。。。我试过这个:Mouse.AddMouseDownHandlermyScatterItem,newmousebuttoneventhandlertestmousedown;myScatterItem.MouseDown+=blablabla…我的错!这显然是一个与触摸相关的事件,不会像鼠标双击那样工作。假设双击的唯一方法是处理触地事件,并有一个附加的行为,该行为将使两次后续触地之间的差异保持在行为附加的相同元素上,例如半秒的差异…1您不应该这样做-请参阅下面我的答案。2你应该使用触地而不是触地离开。除了实际举起你的手指外,在其他几种情况下都会提出请假。3要比较触摸事件之间的坐标,需要使用相对于屏幕的坐标,而不是散点视图。散射视图甚至它所在的窗口本身都可能在事件之间移动。这是一个常见的难以诊断的错误来源感谢你的评论,但是触地/触地事件似乎从未在我的ScatterViewItem上提出过。。。我不知道为什么……我同意你的看法,双击并不是触摸屏的主要选择动作,但我已经说过iPhone\iPad确实支持双击进行缩放。因此,它可以作为用户操作的一个选项。
     private void MouseButtonDownHandler(object sender, MouseButtonEventArgs e)
     {
           if (e.ClickCount == 2) 
           {
                  //// Its a double click... should work for touch.
           }
     }