2014-01-30 83 views
0

我想讓多個按鈕在WP 7/8上完全獨立拖動,但我遇到了一些麻煩。在多個按鈕上實現拖放操作

我的主要問題是,我有這樣的佈局設置...

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; 

是遞增XY性質dragTranslation每次。嘗試將XY的值重置爲增量前的初始值。或者,如果初始值爲零,您可以簡單地分配新值(而不是用新值添加當前值)。

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

感謝您的回答!但是,如果我進行了您提到的更改,則按鈕會「卡」到其初始位置。他們看起來像是在「試圖」逃離,但是一股巨大的磁力正在讓他們失望。這很難解釋。 – PeterInvincible

+0

也許嘗試從其他答案的建議,嘗試在事件處理程序('dragTranslation = new TranslateTransform();')中創建新的TraslateTransform,而不是重複使用同一個對象。 – har07

+0

如果我這樣做,會發生同樣的事情。在我看來,由於事件處理程序每​​次移動像素(「拖動」)時都會被調用,並且正在重置我試圖拖動的按鈕的初始位置。如果我非常小心又快速,我可以「輕彈」按鈕,但在我試圖再次拖動的那一刻,它會繼續。 – PeterInvincible

1

在所有sender對象(draggedButton)是具有RenderTransform設置爲同一個對象的代碼 - dragTranslation

XY的值爲dragTranslation發生更改時,它會影響所有引用通用對象的對象 - dragTranslation

如果是這樣,請嘗試爲每個對象創建一個實例。如果這可以工作,你可以考慮優化。

或者問題可能是因爲的建議@ har07

+0

感謝您的回答!請在@ har07的回答下查看評論#3。 – PeterInvincible

0

最終的解決方案是非常簡單和邏輯遞增值。 As @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; 
     }