WPF, Shapes
我有自定义Shape
,并尝试在其上实施MouseClick
和MouseDoubleClick
内容。
通过例如。我需要打开一个关于MyShape OnClick的信息窗口,然后选择它OnDoubleClick。
存根如下:
public class MyShape : Shape
{
public Point Point1, Point2;
public MyShape() : base() { }
protected override Geometry DefiningGeometry
{
get { return new LineGeometry(Point1, Point2); }
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (e.ClickCount == 1)
{
// Open Informational Window
}
else if (e.ClickCount == 2)
{
// Select Item
}
}
}
每次我双击// Only do MouseClick
和// Only do MouseDoubleClick
时都会发生。
有没有办法在WPF,.NET 4中避免这种情况?
答案 0 :(得分:2)
在第一次点击和第二次点击之间双击我认为有一个时间大约50和400毫秒,所以波纹管代码不是最好的,但做的伎俩:
bool firstClicked = false;
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (e.ClickCount == 1)
{
firstClicked = true;
Task tsk = new TaskFactory()
.StartNew(
() =>
{
Thread.Sleep(SystemInformation.DoubleClickTime);
if (firstClicked)
{
// if you want to use `e`
// e.Source
// Open Informational Window
}
firstClicked = false;
}
);
}
}
else if (e.ClickCount == 2)
{
firstClicked = false;
// Select Item
}
}
答案 1 :(得分:1)
正如我在评论中所说,我曾经遇到过同样的问题。我需要检测双击,但点击和双击应该表现为单独的事件。这意味着,如果触发了双击,则不应触发单击(因为每个操作在UI中具有不同且不兼容的效果)。
“本机”双击对我来说不起作用,因为点击事件会触发是否发生了双击。这是Actionscript中的一些示例代码。我相信你能够遵循(简单)逻辑在.net中实现它。请注意,我正在硬编码双击时间,因为我无法从Actionscript获取系统值。这不是理想的,但我必须做出妥协。您应该使用操作系统(或运行时)提供的时间间隔(如果您可以使用它)。
希望它有所帮助。
package {
import flash.events.*;
import flash.display.*;
import flash.utils.*;
public class Button extends Sprite {
public function DCButton() {
super();
graphics.beginFill(0xff0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK,handleClick);
}
private var _clickCount:int = 0;
private var _doubleClickInterval:int = 200;
private function handleClick(e:MouseEvent):void {
_clickCount++;
// start the timer and when it completes, check the number of clicks
// based on this, dispatch either click or doubleClick events
if(_clickCount == 1) {
setTimeout(checkDoubleClick,_doubleClickInterval,e);
}
else
{
checkDoubleClick(e);
}
}
private function checkDoubleClick(e:MouseEvent):void {
if(_clickCount == 0) return;
var type:String;
if(_clickCount == 1) {
type="click";
} else if(_clickCount > 1) {
type="doubleClick";
}
trace(type);
_clickCount = 0;
// dispatch the detected event here...
}
}
}
答案 2 :(得分:0)
每个DoubleClick都以点击开始。
答案 3 :(得分:0)