Windows runtime 如何取消指针的拖动操作
我要找的是安装在Windows8.1上的邮件应用程序。开始拖动,可以随时按Escape键取消拖动 我尝试了两件事,但都失败了:Windows runtime 如何取消指针的拖动操作,windows-runtime,winrt-xaml,windows-8.1,Windows Runtime,Winrt Xaml,Windows 8.1,我要找的是安装在Windows8.1上的邮件应用程序。开始拖动,可以随时按Escape键取消拖动 我尝试了两件事,但都失败了: 我保留对DRAGITEMSSStartingEventArgs的引用,并在按下Escape键时设置“DRAGITEMSSStartingEventArgs.Cancel=true” 我将ListView CanDragItems属性设置为false 我目前的假设是邮件应用程序是围绕HTML5/JS构建的,它具有XAML应用程序无法具备的功能。。。我希望我错了 谢谢
- 我保留对DRAGITEMSSStartingEventArgs的引用,并在按下Escape键时设置“DRAGITEMSSStartingEventArgs.Cancel=true”
- 我将ListView CanDragItems属性设置为false
ArchieCoder我没有太多地使用拖放API,所以我只能看到您尝试过的东西。不过,我最近确实发现(多亏Tim Heuer在某处提到)这个示例可能会有所帮助。我认为它描述了8.1的一个新API,它允许您在
滚动查看器
中处理操作事件(当您将系统
和TranslateX/Y
组合在一起时),并且您不想再滚动它们(例如,当您开始拖动时)。这可以让您实现您自己的自定义拖放版本,并具有所需的任何功能。我认为值得讨论的是,为什么保留对cancel事件参数的引用不是解决方案,因为cancel事件是如何编程的。稍后,这对每个人都是值得的。那么,让我们假设我们要向太空发射火箭。Fire()方法本身可能如下所示
void Fire()
{
Rocket.Fire();
}
event EventHandler AfterFire;
void Fire()
{
Rocket.Fire();
AfterFire(this, EventArgs.Empty);
}
但因为我们会让人们在它完成后做出反应,所以我们可能会创建一个AfterFire
事件,让人们知道它已经完成。可能是这样的
void Fire()
{
Rocket.Fire();
}
event EventHandler AfterFire;
void Fire()
{
Rocket.Fire();
AfterFire(this, EventArgs.Empty);
}
实际上,您需要一些错误处理来纠正错误
但因为我们希望人们在实际开火行动之前询问火箭发射是否安全,所以我们在开火前加入了一个
事件,让人们知道它即将发生。但如果火箭不安全,我们希望包括取消发射的能力。像这样
class BeforeFireEventArgs: EventArgs { public bool Cancel { get; set; }}
event EventHandler<BeforeFireEventArgs> BeforeFire;
event EventHandler AfterFire;
void Fire()
{
var args = new BeforeFireEventArgs();
BeforeFire(this, args);
if (args.Cancel)
return;
Rocket.Fire();
AfterFire(this, EventArgs.Empty);
}
类BeforeFireEventArgs:EventArgs{public bool Cancel{get;set;}
Fire之前的事件处理程序;
事件处理程序余火;
虚火
{
var args=新的BeforeFireEventArgs();
火灾前(本,args);
如果(参数取消)
返回;
火箭弹;
余火(此事件为空);
}
这里需要注意的是,BeforeFireEventArgs
是在这个方法中创建的,通过这个方法传递给事件,并在事件返回到这个方法后进行查询。如果要在点火前处理事件
,则可以将取消
设置为true,并且不会点火
WinRT GetDeleral()模式可用于处理此场景
但是,如果您要处理BeforeFire
事件,而不是将Cancel
设置为true,而是保留对BeforeFireEventArgs
的引用供以后使用,则处理程序将释放该事件,Cancel
将阻止或允许火箭发射
然后,一分钟后,如果您在FireEventArgs之前使用相同的引用,并将Cancel
设置为true!时机已经太晚了。太晚了。该事件已被提出。已经处理好了。而Cancel
已被询问
有意义吗?啊,当然。你可以这样做。这是怎么做的
public sealed partial class MainPage : Page
{
Pointer _Pointer = default(Pointer);
public MainPage()
{
this.InitializeComponent();
this.Dispatcher.AcceleratorKeyActivated += (s, e) =>
{
if (e.EventType == (CoreAcceleratorKeyEventType.SystemKeyDown & CoreAcceleratorKeyEventType.KeyDown)
&& e.VirtualKey == VirtualKey.Escape)
{ MyListView.ReleasePointerCapture(_Pointer); }
};
this.PointerMoved += (s, e) =>
{ _Pointer = e.Pointer; };
}
}
另外,列表视图
名为MyListView
祝你好运 你的解释完全有道理!谢谢你,杰瑞。你是说延期吗?:)哥们!你可以简单地更新答案。是的,延期,不是转介!呵呵!虽然我认为Match.com使用了这种方法。2014年5月6日,你是我的英雄:)我会尽我所能。从我这里获得+1作为一个不错的黑客。现在,让我们向平台添加拖放取消支持…:)我想补充一个想法——如果用户可能无意中开始拖拉或改变主意——并非所有人都知道escape键的诀窍,因此为了改进UX,您可以再添加两件事来改进它——1。如果可能,请启用拖放操作的撤消,然后执行2。提供一些不处理拖放数据的安全拖放目标,但可能会向用户提供有关拖放操作的反馈,表明当用户在该目标处拖放时,该操作将被取消,并且该目标可能只是整个页面-除了对拖放数据进行操作的目标之外的任何位置。