在多个按钮上实现拖放

时间:2014-01-30 23:17:07

标签: c# oop xaml windows-phone-7 windows-phone-8

我想在WP 7/8上让多个按钮完全独立可拖动,但我遇到了一些麻烦。

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

enter link description here

如果我愿意的话,我希望能够独立地拖动按钮。现在拖动工作正常,只有一个按钮,但是一旦我释放它并尝试拖动另一个按钮,它只是“按下”我按下的第一个按钮旁边,这一直持续到所有按钮移动到同时。

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

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

3 个答案:

答案 0 :(得分:1)

我怀疑这一行引起的问题:

dragTranslation.X += e.DeltaManipulation.Translation.X;
dragTranslation.Y += e.DeltaManipulation.Translation.Y;
每次都会X增加YdragTranslation属性。尝试将XY的值重置为增量前的初始值。或者,如果初始值为零,您可以简单地指定新值(而不是使用新值添加当前值)。

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

答案 1 :(得分:1)

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

X的{​​{1}}和Y的值发生变化时,它会影响所有引用公共对象的对象 - dragTranslation

如果是这样,请尝试为每个对象设置一个实例。如果可行,您可以考虑优化。

或问题可能是因为 @ har07

建议的增加值

答案 2 :(得分:0)

最后解决方案非常简单和合乎逻辑。 正如 @Sandeep G B 所述, snapping 发生了,因为所有按钮都使用相同的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;
        }