如何取消指针的拖动操作

时间:2014-05-06 15:53:27

标签: windows-runtime winrt-xaml windows-8.1

我正在寻找的东西就像Windows 8.1上安装的Mail应用程序一样。您开始拖动,您可以随时按退出键取消拖动。

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

  • 我保留对DragItemsStartingEventArgs的引用并设置" dragItemsStartingEventArgs.Cancel = true"当按下Escape键时。
  • 我将ListView CanDragItems属性设置为false。

目前我的假设是Mail应用程序是围绕HTML5 / JS构建的,它具有XAML应用程序无法拥有的功能......我希望我错了。

由于 ArchieCoder

3 个答案:

答案 0 :(得分:2)

啊,当然。你可以这样做。这是怎么回事。

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; };
    }
}

此外,ListView名为MyListView。

祝你好运!

答案 1 :(得分:0)

我没有使用那种拖拽和放大器放弃API太多,所以我能看到的唯一的东西是你尝试过的。我最近发现(感谢Tim Heuer在某处提到的)这个样本advanced input concepts可能会有所帮助。我认为它描述了8.1的新API,它允许您处理ScrollViewer内部的操作事件(当您合并SystemTranslateX/Y ManipulationModes)和{{3}时他们你不想再滚动(例如当你开始拖动时)。这可以让您使用您需要的任何功能实现自己的拖放定制版本。

答案 2 :(得分:0)

我认为值得讨论为什么保留对取消事件参数的引用不是解决方案,因为取消事件的编程方式。这对所有人来说都是值得的。所以,让我们假装我们要向太空发射火箭。 Fire()方法本身可能如下所示。

void Fire()
{
    Rocket.Fire();
}

但是因为我们会在完成后让人们对它作出反应,我们可能会创建一个AfterFire事件让人们知道它已经完成。它可能看起来像这样。

event EventHandler AfterFire;
void Fire()
{
    Rocket.Fire();
    AfterFire(this, EventArgs.Empty);
}
  

在所有现实中,你需要一些错误处理才能做到这一点。

但是因为我们希望人们在实际射击行动之前询问火箭发射是否安全,我们会加入BeforeFire事件让人们知道它即将来临。但是如果火箭不安全,我们希望包括取消的能力。像这样。

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是在此方法中创建的,通过此方法传递给事件,并在事件返回到此方法后进行询问。如果您要处理BeforeFire事件,可以将Cancel设置为true,它就不会触发。

  

存在WinRT GetDeferral()模式来处理这种情况

但是,如果您要处理BeforeFire事件,不将Cancel设置为true,但保留对BeforeFireEventArgs的引用以供日后使用,则处理程序将释放该事件并且Cancel会阻止或允许火箭射击。

然后,如果您使用BeforeFireEventArgs的相同引用并将Cancel设置为true,则一分钟后!时机已经太晚了。为时已晚。该事件已经提出。它已经处理完毕了。 Cancel已被审讯。

有意义吗?