Windows runtime 如何取消指针的拖动操作

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应用程序无法具备的功能。。。我希望我错了 谢谢

我要找的是安装在Windows8.1上的邮件应用程序。开始拖动,可以随时按Escape键取消拖动

我尝试了两件事,但都失败了:

  • 我保留对DRAGITEMSSStartingEventArgs的引用,并在按下Escape键时设置“DRAGITEMSSStartingEventArgs.Cancel=true”
  • 我将ListView CanDragItems属性设置为false
我目前的假设是邮件应用程序是围绕HTML5/JS构建的,它具有XAML应用程序无法具备的功能。。。我希望我错了

谢谢
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。提供一些不处理拖放数据的安全拖放目标,但可能会向用户提供有关拖放操作的反馈,表明当用户在该目标处拖放时,该操作将被取消,并且该目标可能只是整个页面-除了对拖放数据进行操作的目标之外的任何位置。