2014-01-30 3 views
0

Я пытаюсь получить несколько кнопок, которые можно полностью перетащить на WP 7/8, но у меня проблемы.Реализация Drag And Drop на нескольких кнопках

Моя главная проблема заключается в том, что у меня есть этот макет настроить ...

enter link description here

И я хотел бы, чтобы иметь возможность independetly перетянуть кнопки прочь, если я хочу. Теперь перетаскивание работает до одной кнопки, но как только я отпустите его и попытаюсь перетащить еще один, он просто «защелкнется» рядом с первой нажатой мной кнопкой, и это продолжается и продолжается, пока все кнопки не перемещаются на в то же время.

Так что, в основном, когда происходит эта «привязка», несколько кнопок начинают перемещаться вместе, как если бы они были только одной кнопкой.

Вот мой XAML код:

<Grid Name="buttons_container" Grid.Row="1" Margin="0,0,0,0"> 
    <toolkit:WrapPanel HorizontalAlignment="Center" Margin="0,0,0,0" Name="wrapPanel1" VerticalAlignment="Center" Width="600"> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="1" Height="70" Name="button2" Width="150"> 

     </Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="2" Height="70" Name="button3" Width="150" ></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="3" Height="70" Name="button4" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="4" Height="70" Name="button5" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="5" Height="70" Name="button6" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="6" Height="70" Name="button7" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="7" Height="70" Name="button8" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="8" Height="70" Name="button9" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="9" Height="70" Name="button10" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="10" Height="70" Name="button11" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="11" Height="70" Name="button12" Width="150"></Button> 
     <Button ManipulationDelta="Drag_ManipulationDelta" Content="12" Height="70" Name="button13" Width="150"></Button> 
    </toolkit:WrapPanel> 
</Grid> 

Вот мой C# код:

private TranslateTransform dragTranslation; - global 

dragTranslation = new TranslateTransform(); - in constructor of the class 

     void Drag_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
     { 
      Button draggedButton = (Button)sender; 

      draggedButton.RenderTransform = dragTranslation; 
      dragTranslation.X += e.DeltaManipulation.Translation.X; 
      dragTranslation.Y += e.DeltaManipulation.Translation.Y; 
     } 

ответ

1

Я подозреваю, что проблема, вызванная этой линии:

dragTranslation.X += e.DeltaManipulation.Translation.X; 
dragTranslation.Y += e.DeltaManipulation.Translation.Y; 

, что увеличивающиеся X и Y свойства от dragTranslation каждый раз. Попробуйте сбросить значение X и Y до его начального значения до приращения. Или вы можете просто назначить новое значение (вместо добавления текущего значения с новым значением), если начальные значения равны нулю.

dragTranslation.X = e.DeltaManipulation.Translation.X; 
dragTranslation.Y = e.DeltaManipulation.Translation.Y; 
+0

Благодарим за ответ! Однако, если я сделаю упомянутые вами изменения, кнопки просто «застревают» в их исходном положении. Они выглядят так, будто они «пытаются» уйти, но большая магнитная сила удерживает их. Это очень трудно объяснить. – PeterInvincible

+0

, возможно, попробуйте с предложением от другого ответа, попробуйте создать новый TraslateTransform в обработчике событий ('dragTranslation = new TranslateTransform();') вместо повторного использования одного и того же объекта. – har07

+0

То же самое происходит, если я это сделаю. Мне кажется, что, поскольку обработчик события вызывается каждый раз, когда пиксель перемещается («перетаскивается») и сбрасывает начальную позицию кнопки, которую я пытаюсь перетащить. Если я очень осторожен и быстр, я могу «щелкнуть» кнопку, но в тот самый момент, когда я пытаюсь перетащить ее, она продолжает это. – PeterInvincible

1

В коде все объекты sender (draggedButton) имеете RenderTransform набор на тот же объект - dragTranslation.

Когда значения для X и Y для dragTranslation изменяется она влияет на все объекты, которые оказывают ссылку на общий объект - dragTranslation.

Если да, попробуйте иметь экземпляр на объект. Если это работает, вы можете подумать об оптимизации.

Или проблема может быть из-за приращением значения, как предложено @ har07

+0

Спасибо за ответ! Пожалуйста, проверьте комментарий №3 под ответом @ har07. – PeterInvincible

0

В конце концов решение было довольно простым и логичным. Как @Sandeep G B заявил, что щелчок произошел, потому что все кнопки использовали один и тот же объект TranslateTransform.

Мне просто нужно создать обработчик событий при запуске перетаскивания и создать там новый объект TranslateTransform.

private void Drag_ManipulationStarted(object sender, ManipulationStartedEventArgs e) 
     { 
      dragTranslation = new TranslateTransform(); 
      draggedButton = (Button)sender; 
     } 

     private void Drag_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
     { 
      draggedButton.RenderTransform = dragTranslation; 
      dragTranslation.X += e.DeltaManipulation.Translation.X; 
      dragTranslation.Y += e.DeltaManipulation.Translation.Y; 
     }