我有一个在画布上的拖放操作,当对象被拖入和拖出时应该做某些事情。我的问题是DragEnter / DragLeave事件会随着鼠标将对象移动到其上而不仅仅是在进入/退出时触发。鼠标移动得越快,事件触发得就越频繁。
Canvas DragOver事件会移动DraggedObject的Canvas.Top / Left,我认为这可能是我的问题,但我不确定如何解决它。
我有一个在画布上的拖放操作,当对象被拖入和拖出时应该做某些事情。我的问题是DragEnter / DragLeave事件会随着鼠标将对象移动到其上而不仅仅是在进入/退出时触发。鼠标移动得越快,事件触发得就越频繁。
Canvas DragOver事件会移动DraggedObject的Canvas.Top / Left,我认为这可能是我的问题,但我不确定如何解决它。
这有点老了,但我遇到了同样的问题。我正在使用装饰器来指示拖动物体被拖动到哪里。我会在DragEnter
中启用装饰器,然后立即注册一个DragLeave
并禁用装饰器,然后是DragEnter
...
IsEnabled = false
对我不起作用,但IsHitTestVisible = false
可以。我将其放在我的装饰器构造函数中,现在一切都运行得很好:
public DragDropAdorner(UIElement adornedElement) : base(adornedElement)
{
_layer = AdornerLayer.GetAdornerLayer(AdornedElement);
_layer.IsEnabled = false;
_layer.IsHitTestVisible = false;
}
我曾经遇到过类似的问题,而解决之道就是e.Handled = true;。
当拖动某个物品到选项卡时,我想要选择一个TabItem。这是我的解决方案。
在资源字典中定义:
<Style TargetType="TabItem">
<Setter Property="AllowDrop" Value="True" />
<EventSetter Event="DragEnter" Handler="tabDragEnter" />
<EventSetter Event="DragOver" Handler="tabDragOver" />
</Style>
然后是tabDragEnter处理程序:
private void tabDragEnter(object sender, DragEventArgs e)
{
TabItem m_TabItem = sender as TabItem;
m_TabItem.IsSelected = true;
}
private void tabDragOver(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.None;
e.Handled = true;
}
我最近遇到了类似的问题,尽管是在 Angular 6 框架下,使用响应式表单。这是我针对我的情况解决它的方法:
基本上简单来说,当拖动正在进行时,我关闭了该组件上的变更检测。
import { ChangeDetectorRef } from '@angular/core';
constructor(private chngDetRef: ChangeDetectorRef) { //...
private onDragStart(event, dragSource, dragIndex) {
// ...
this.chngDetRef.detach();
// ...
private onDrop(event, dragSource, dragIndex) {
// ...
this.chngDetRef.reattach();
// ...
private onDragEnd(event, dragIndex) {
// ...
this.chngDetRef.reattach();
// ...
如果您有很多父组件或分层组件,为了看到实质性的改进,您可能还需要对它们的变更检测进行一些处理。
祝您好运!