在WPF中拖放图像

cod*_*ple 1 c# wpf drag-and-drop

我试图将图像从画布上的一个点拖放到另一个点(应该相对简单),但无法弄明白.我要移动的图像有以下XAML:

<Image Height="28" HorizontalAlignment="Left" Margin="842,332,0,0" Name="cityImage" Stretch="Fill" VerticalAlignment="Top" Width="42" Source="/Settlers;component/Images/city.png" MouseLeftButtonDown="cityImage_MouseLeftButtonDown" MouseMove="cityImage_MouseMove" MouseLeftButtonUp="cityImage_MouseLeftButtonUp"/>
Run Code Online (Sandbox Code Playgroud)

代码如下:

bool isDragging = false; Point initMousePos; private void cityImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
isDragging = true;
initMousePos = e.GetPosition(theGrid); } private void cityImage_MouseMove(object sender, MouseEventArgs e) {
if (isDragging)
{
    Image image = sender as Image;
    Canvas.SetTop(image, initMousePos.X);
    Canvas.SetLeft(image, initMousePos.Y);
    image.Visibility = System.Windows.Visibility.Visible;
} }
Run Code Online (Sandbox Code Playgroud)

private void cityImage_MouseLeftButtonUp(object sender,MouseButtonEventArgs e){isDragging = false; }

And*_*eas 5

我做什么来完成你想要的是使用

System.Windows.Controls.Primitives.Thumb 
Run Code Online (Sandbox Code Playgroud)

作为UserControl的Root并设置ControlTemplate以显示图像(在边框内,但它应该没有那么好),如下所示:

<Thumb Name="myRoot" DragDelta="MyRootDragDelta">
  <Thumb.Template>
    <ControlTemplate>
      <Image ... >
      ... see below ...
      </Image>
    </ControlTemplate>
  </Thumb.Template>
</Thumb>
Run Code Online (Sandbox Code Playgroud)

另外,我将Image的Source绑定到类的属性:

<Image.Source>
  <Binding Path="ImageSource" RelativeSource=
                 {RelativeSource FindAncestor,
                  AncestorType=my:MyImageControl, AncestorLevel=1}" />
</Image.Source>
Run Code Online (Sandbox Code Playgroud)

UserControl有一个名为TranslateTransform(比方说translateTransform)的属性X,Y并将在DragDelta事件处理程序中设置:

private void MyRootDragDelta(object sender, DragDeltaEventArgs e) 
{
  translateTransform.X += e.HorizontalChange;
  translateTransform.Y += e.VerticalChange;
}
Run Code Online (Sandbox Code Playgroud)

别忘了添加:

public ImageSource ImageSource { get; set; }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.如果有什么不清楚的话随时可以进一步询问.