如何在 MVVM 的框架中制作这样一个带有预览的拖放,就像在 gif 上一样?
是Canvas与对象绑定的集合。按照此答案中的示例,每个对象都已CustomControl在其中实现了通常的拖放操作。
我想在MouseMove制作VisualBrush当前对象时,用这个画笔绘制一个新的矩形并拖动它。但毕竟,它Canvas是绑定到集合中的,事实证明,这个矩形也需要添加到集合中才能显示出来。
<ItemsControl ItemsSource="{Binding itemsList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" Width="1000" Height="1000"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:CustomControl/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Position.X}"/>
<Setter Property="Canvas.Top" Value="{Binding Position.Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>

让我们尝试调整此答案中的代码,以便在您放手之前它不会在现实中包裹正方形。
idea c
VisualBrush是个好主意,这样我们就可以很容易地“乘以”已有的元素。但是在集合中加入一个dummy元素并不好,毕竟我们的动作关注的是UI层面,而不是模型。因此,VM 级别完全不会发生任何变化,这很好。
让我们在方块列表的顶部添加另一个级别。为了不干扰,我们将使其对鼠标透明。我们需要绑定两个元素的大小,为此我们需要一个名称和
Binding:为它添加了一个名称
ItemsControl,DraggableSquare为它出现了一个额外的绑定(稍后会详细介绍),并且在底部出现Canvas了包含所需元素的内容。接下来,
DraggbleSquare。我们正在稍微改变我们的内部逻辑。UpdatePosition现在只会在释放鼠标或窗口失去焦点时调用。逻辑的新部分:
UpdateDraggedSquarePosition. 为此,我们需要一个新的依赖属性DraggedImageContainer,其中我们已经在 XAML 中放置了一个表示移动图像的元素。(把它放得更高,靠近
RequestMoveCommand。)实际上是新逻辑本身:
是的,我不得不稍微改变一下
GetParent以使其适用于任意元素:并以
OnMouseDown书面形式就这样了。
为了拍出漂亮的照片,我还给 加了颜色
SquareVM:并将颜色设置为
MainVM:我也喜欢上了他
DraggableSquare.xaml:结果是这样的:
如果您希望将图像移动得更小,最简单的缩小方法是
RenderTransform: