2

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

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

控件有一个有趣的行为要加速,并且在“放下”它后会移动/滑动一点。虽然很酷,但我不想要这种行为,因此改变了主意:我正在寻找一种解决方案,可以为一张活动卡片定义特定区域,为更多卡片定义一个长凳,为甲板定义堆叠,这样人们就可以自由拖动一张牌,但只有在这些特定区域上方才能丢弃,否则它将回到指定的手牌区域。

我可以尝试什么来实现这种期望的行为?

4

1 回答 1

0

我认为你和我在同一条船上,我正在开发 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 对象并编写我自己的客户处理程序来移动鼠标以获取卡片对象可拖动,然后卡入游戏板上的一行或其他位置。

干杯,

詹姆士

于 2013-04-29T19:18:27.010 回答