2013-04-11 74 views
2

尝试使用下面的代码片段移动卡片(现在的图片)时,我对结果并不满意。Windows 8应用程序:“捕捉”卡片游戏的拖放

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(); 

该控制有一个有趣的行为加速,并将其“放下”后移动/滑动一下。虽然很酷,但我不想要这种行为,因此改变了我的想法:我正在寻找的解决方案是为一张活动卡片定义特定区域,为甲板上的多张卡片和堆叠定义一个长凳,以便可以自由拖拽一张卡,但只有当它位于这些特定区域上方时才能被丢弃,否则它将返回到为卡片指定的区域。

我可以尝试实现这种所需的行为?

回答

0

我认为你和我在同一条船上,我正在制作一个地铁卡游戏应用程序,并且我并不十分满意我所发现的拖放功能。我的初始方法是使用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. 

你也可以得到一定的控制在Interia上添加一个MainipulationInertiaStarting处理程序,虽然只是在处理程序中设置e.Handled = true并不像其他人所暗示的那样禁用interia。

我很想听到你回来,看看你拿出什么办法来捕捉卡片,在这一点上,我正在考虑只使用一个大的画布对象,并写下我自己的客户处理程序鼠标移动到让卡片对象可以拖动,然后卡入游戏板上的一排或其他位置。

干杯,

詹姆斯