在WPF中拖放图像

时间:2010-06-20 18:07:12

标签: 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"/>

代码如下:

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;
} }

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

2 个答案:

答案 0 :(得分:5)

我要做的就是使用

来完成你想要的
System.Windows.Controls.Primitives.Thumb 

作为UserControl的Root并设置ControlTemplate以显示图像(在边框内,但它应该可以正常工作),如:

<Thumb Name="myRoot" DragDelta="MyRootDragDelta">
  <Thumb.Template>
    <ControlTemplate>
      <Image ... >
      ... see below ...
      </Image>
    </ControlTemplate>
  </Thumb.Template>
</Thumb>

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

<Image.Source>
  <Binding Path="ImageSource" RelativeSource=
                 {RelativeSource FindAncestor,
                  AncestorType=my:MyImageControl, AncestorLevel=1}" />
</Image.Source>

UserControl有一个名为TranslateTransform(比方说translateTransform),其属性XY将在DragDelta事件处理程序中设置:< / p>

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

不要忘记添加:

public ImageSource ImageSource { get; set; }

希望这会有所帮助。如果有任何不清楚的地方可以随意提问。

答案 1 :(得分:1)

您希望将“画布”的“左”和“顶”属性设置为初始位置以外的其他属性。在MouseMove处理程序中,您必须获取相对于父级的位置。也;确保父元素是画布而不是网格。图像上有一个相当大的左边距和上边距,以及变量名称为“theGrid”的控件。