Winforms 在windows Phone中实现拖动和交换项目

Winforms 在windows Phone中实现拖动和交换项目,winforms,windows-phone-7,windows-7,drag-and-drop,Winforms,Windows Phone 7,Windows 7,Drag And Drop,我是windows phone新手。我的问题如下: 我有一个由按钮组成的网格。我想为按钮实现拖放和交换功能。如何在WP7平台上实现此功能。以下是解决方案xaml看起来像这样 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <toolkit:WrapPanel Height="510" HorizontalAlignment="Left" Margin="18,56,0,0"

我是windows phone新手。我的问题如下:
我有一个由按钮组成的网格。我想为按钮实现拖放和交换功能。如何在WP7平台上实现此功能。

以下是解决方案xaml看起来像这样

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <toolkit:WrapPanel Height="510" HorizontalAlignment="Left" Margin="18,56,0,0" Name="wrapPanel1" VerticalAlignment="Top" Width="411">
                    <Button Content="1" Height="124" Name="button2" Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="2" Height="124" Name="button3" Width="134" >
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="3" Height="124" Name="button4" Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="4" Height="124" Name="button5"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="5" Height="124" Name="button6"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="6" Height="124" Name="button7"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="7" Height="124" Name="button8"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="8" Height="124" Name="button9"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="9" Height="124" Name="button10"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="10" Height="124" Name="button11" MouseLeftButtonDown="mouseDown" Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="11" Height="124" Name="button12"  Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                    <Button Content="12" Height="124" Name="button13" Width="134">
                        <toolkit:GestureService.GestureListener>
                            <toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted" />
                        </toolkit:GestureService.GestureListener>
                    </Button>
                </toolkit:WrapPanel>
            </Grid>

现在是C背后的代码#

翻译形式翻译形式

PointCollection points=new System.Windows.Media.PointCollection()

按钮对象

 private void GestureListener_DragStarted(object sender, DragStartedGestureEventArgs e)
     {
             translateTransform = new TranslateTransform();
             firstObject = sender as Button;
             var transform1 = firstObject.TransformToVisual(wrapPanel1);
            Point absolutePosition1 = transform1.Transform(new Point(0, 0));                 
     }







private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e)
      {
          var moveablebutton = sender as Button;
          moveablebutton.RenderTransform = translateTransform;
           translateTransform.X += e.HorizontalChange;
           translateTransform.Y += e.VerticalChange;          
      }





 private void GestureListener_DragCompleted(object sender, DragCompletedGestureEventArgs e)
   {
                var lastObject = sender as Button;
                Button b=new Button();
                int count = wrapPanel1.Children.Count;
                int index = wrapPanel1.Children.IndexOf(lastObject);
                var transform2 = lastObject.TransformToVisual(wrapPanel1);
                Point absolutePositon2 = transform2.Transform(new Point(0, 0));
                Point P1;
                Point P2 ;
                Point P3 ;
                Point P4 ;
                P1 = e.GetPosition(wrapPanel1);
                P2 = new Point(P1.X+134, P1.Y+124);



                Button swapitem=null;

                foreach (UIElement ctrl in wrapPanel1.Children)
                {
                    int index2;
                    var transform3 = ctrl.TransformToVisual(wrapPanel1);
                    Point comparePos = transform3.Transform(new Point(0, 0));

                    swapitem = ctrl as Button;
                    index2 = wrapPanel1.Children.IndexOf(swapitem);
                    if (index != index2)
                    {
                        P3 = new Point(comparePos.X, comparePos.Y);
                        P4 = new Point(comparePos.X + 158, comparePos.Y+170);
                       if (!(P2.Y < P3.Y || P1.Y > P4.Y || P2.X < P3.X || P1.X > P4.X))
                        {
                            swapitem = ctrl as Button;
                            index2 = wrapPanel1.Children.IndexOf(swapitem);
                            b = lastObject as Button;
                            b.RenderTransform = translateTransform;
                            translateTransform.X -= e.HorizontalChange;
                            translateTransform.Y -= e.VerticalChange;
                            wrapPanel1.Children.Remove(lastObject);
                            wrapPanel1.Children.Remove(swapitem);
                            // wrapPanel1.Children.RemoveAt(index2);
                            if (index < index2)
                            {
                                wrapPanel1.Children.Insert(index, swapitem);
                                wrapPanel1.Children.Insert(index2, b);
                            }
                            else
                            {
                                wrapPanel1.Children.Insert(index2, b);
                                wrapPanel1.Children.Insert(index, swapitem);
                            }
                            break;
                        }}

                }

            }
private void GestureListener_DragStarted(对象发送方,DragStartedGestureEventArgs e)
{
translateTransform=新的translateTransform();
firstObject=发送者作为按钮;
var transform1=firstObject.TransformToVisual(wrapPanel1);
点绝对位置1=变换1.变换(新点(0,0));
}
私有void GestureListener_DragDelta(对象发送方,DragDeltaGestureEventArgs e)
{
var moveablebutton=发送方为按钮;
moveablebutton.RenderTransform=translateTransform;
translateTransform.X+=e.水平变化;
translateTransform.Y+=e.垂直变化;
}
私有void GestureListener_DragCompleted(对象发送方,DragCompletedGestureEventArgs e)
{
var lastObject=发送者作为按钮;
按钮b=新按钮();
int count=wrapPanel1.Children.count;
int index=wrapPanel1.Children.IndexOf(lastObject);
var transform2=lastObject.TransformToVisual(wrapPanel1);
点绝对位置2=变换2.变换(新点(0,0));
P1点;
P2点;
P3点;
P4点;
P1=e.GetPosition(wrapPanel1);
P2=新点(P1.X+134,P1.Y+124);
按钮swapitem=null;
foreach(wrapPanel1.Children中的UIElement ctrl)
{
int index2;
var transform3=ctrl.TransformToVisual(wrapPanel1);
点比较=变换3.变换(新点(0,0));
swapitem=ctrl as按钮;
index2=wrapPanel1.Children.IndexOf(swapitem);
如果(索引!=index2)
{
P3=新点(比较点X,比较点Y);
P4=新点(比较点X+158,比较点Y+170);
if(!(P2.YP4.Y | P2.XP4.X))
{
swapitem=ctrl as按钮;
index2=wrapPanel1.Children.IndexOf(swapitem);
b=最后一个对象作为按钮;
b、 RenderTransform=translateTransform;
translateTransform.X-=e.水平变化;
translateTransform.Y-=e.垂直变化;
wrapPanel1.Children.Remove(lastObject);
包装1.儿童。移除(swapitem);
//包装1。儿童。移除(index2);
如果(索引
@Shilpa,你能给这段代码添加一些注释吗?因为它需要它们。名称P1、P2、P3、p4无法说明这些点的确切用途。还有常量值(158170),它们从何处获取?添加的常量值是按钮的宽度和高度。P1、P2分别是按钮1的左上角和右下角。p3、p4也是要比较的第二个按钮。那么,重命名它们如何<代码>MovedButtonBottomRightPoint=新点(MovedButtonTopletPoint.X+lastObject.ActualWidth,MovedButtonTopletPoint.Y+lastObject.ActualHeight)看起来比P2=新点(P1.X+134,P1.Y+124)更清晰