我正在寻找的东西就像Windows 8.1上安装的Mail应用程序一样。您开始拖动,您可以随时按退出键取消拖动。
我尝试了两件事,但他们失败了:
目前我的假设是Mail应用程序是围绕HTML5 / JS构建的,它具有XAML应用程序无法拥有的功能......我希望我错了。
由于 ArchieCoder
答案 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
内部的操作事件(当您合并System
和TranslateX/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
已被审讯。
有意义吗?