【发布时间】:2020-02-12 22:49:23
【问题描述】:
我有一个无边界、透明的Window,只有一个Button。
My fancy button looks like this
预期的行为是:
- 当我单击并拖动按钮时,按钮必须跟随光标。
- 当我只单击 Button 时,MouseDown、PreviewMouseDown 事件或 Command 绑定应该会引发。
起初我尝试在 PreviewMouseDown 事件上调用 DragMove(),但这会阻止点击事件。现在我的想法是:我在鼠标按下后设置了 100 毫秒的延迟。如果时间过去了,按钮将被拖动,否则只是单击。
代码
private bool _dragging;
private Point startpos;
CancellationTokenSource cancellation;
private void Button_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (_dragging && e.LeftButton == MouseButtonState.Pressed)
{
var currentpos = e.GetPosition(this);
Left += currentpos.X - startpos.X;
Top += currentpos.Y - startpos.Y;
}
}
private async void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton != MouseButton.Left)
return;
_dragging = false;
startpos = e.GetPosition(this);
cancellation?.Cancel();
cancellation = new CancellationTokenSource();
await Task.Delay(100, cancellation.Token).ContinueWith(task =>
{
_dragging = !task.IsCanceled;
});
}
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (_dragging)
{
_dragging = false;
e.Handled = true;
}
cancellation?.Cancel();
}
基本上可以,但有一些错误:
- 当我长时间按住鼠标按钮并松开时,单击将不起作用,因为 100 毫秒后拖动将处于活动状态。
- 在我拖动按钮并单击
Button和Window控件之外的任意位置后,将引发 PreviewMouseDown 和 PreviewMouseUp 事件。不知道为什么??
有人有更好的解决方案吗?
【问题讨论】: