在多个按钮上实现拖放



我试图在WP 7/8上获得多个可以独立拖动的按钮,但是我遇到了一些麻烦。

我的主要问题是我设置了这个布局...

在此处输入链接说明

,如果需要的话,我希望能够独立地将按钮拖出。现在,拖动的工作正常为一个按钮,但是一旦我释放它并尝试拖动另一个按钮,它只是在我按下的第一个按钮旁边"捕捉",直到所有按钮都在所有按钮上移动到同时。

基本上,当这种"捕捉"发生时,多个按钮开始一起移动,好像它们只是一个按钮。

这是我的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;
        }

我怀疑该行引起的问题:

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

每次dragTranslationXY属性。在增加之前,请尝试将XY的CC_5值重置为初始值。或者,如果初始值为零,则可以简单地分配新值(而不是添加新值的新值)。

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

在代码中所有sender对象(draggedButton)都将RenderTransform设置为同一对象-dragTranslation

当更改XY的值时,它会影响所有对公共对象的引用的对象-dragTranslation

如果是这样,请尝试每个对象具有实例。您可以考虑优化是否有效。

或问题可能是由于@har07

所建议的增加值

最后,解决方案非常简单且逻辑。如 @sandeep g b 所述,发生了 snapping ,因为所有按钮都使用了相同的transerateTransform对象。

我只需要在启动拖动时创建事件处理程序,然后在那里创建一个新的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;
        }

最新更新