Windows 8应用程序:“捕捉”卡片游戏的拖放

walias 发布于 2019-03-09 c# 最后更新 2019-03-09 14:35 5 浏览

尝试使用以下片段移动卡片(现在的图片)后,我对结果并不满意。

Card.ManipulationDelta += (o, args) => {
    var dragableItem = o as Image;
    if (dragableItem == null) return;
    var translateTransform = dragableItem.RenderTransform as TranslateTransform;
if (translateTransform == null) return;
    translateTransform.X += args.Delta.Translation.X;
    translateTransform.Y += args.Delta.Translation.Y;
};
Card.RenderTransform = new TranslateTransform();
该控制有一个有趣的行为加速,并将其“放下”后移动/滑动一下。虽然很酷,但我不想要这样的行为,因此改变了我的想法:我正在寻找的解决方案是为一张活动卡片定义特定区域,为甲板上的多张卡片和堆栈定义一张长凳,以便可以自由拖拽一张卡,但只有在这些特定区域之上时才能被丢弃,否则它将返回指定用于手牌的区域。 我可以尝试实现这种期望的行为?
已邀请:

zcum

赞同来自:

我认为你和我在同一条船上,我正在开发一个Metro卡游戏应用程序,而且我对我发现拖拽的东西并不满意。我的初始方法是使用grid \ stackpanel或其他底层框架,用户可以将卡片图像(通常是自定义控件)拖过,然后当用户放开时图像将捕捉到该框架。我还没有找到一种合适的方法来获得这种行为,因为看起来在Metro中不支持从一个父节点到另一个父节点的控制拖放。 就你的问题而言,你所引用的滑动效果很可能是intertia,你可以通过不设置TranslateInertia模式来禁用它,例如

    Ellipse el = new Ellipse();
    el.Fill = new SolidColorBrush(Windows.UI.Colors.Magenta);
    el.ManipulationMode = (ManipulationModes.All ^ MainipulationModes.TranslateInteria);
//more code to add your ManipulationDelta handler etc.
你也可以通过为MainipulationInertiaStarting添加处理程序来获得对Interia的一些控制,尽管在处理程序中设置e.Handled = true并不像其他人所建议的那样完全禁用interia。 我很乐意听到您的回复,看看您为卡片拍摄的方法是什么,此时我正在考虑使用大型Canvas对象并编写自己的客户处理程序以移动鼠标以获取卡片对象可以拖动,然后卡入游戏板上的一排或其他位置。 干杯, 詹姆士