代码之家  ›  专栏  ›  技术社区  ›  codersarepeople

在WPF中拖放图像

  •  1
  • codersarepeople  · 技术社区  · 16 年前

    我正在尝试将图像从画布上的一个点拖放到另一个点(应该相对简单),但无法弄清楚。我要移动的图像具有以下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(对象发送方,mouseButtonEventArgs e){ isDragging=假;

    2 回复  |  直到 16 年前
        1
  •  5
  •   Andreas    16 年前

    我要做的是达到你想要的目的

    System.Windows.Controls.Primitives.Thumb 
    

    作为用户控件的根,并将ControlTemplate设置为显示图像(在边框内,但它也可以不使用),如下所示:

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

    另外,我将图像的源绑定到类的属性:

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

    用户控件具有一个 TranslateTransform (让我们说 translateTransform )谁的财产 X Y 将设置在 DragDelta 事件处理程序:

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

    不要忘记添加:

    public ImageSource ImageSource { get; set; }
    

    希望这有帮助。如果有任何不清楚的地方,请随时询问。

        2
  •  1
  •   atsjoo    16 年前

    您希望将画布的左上属性设置为初始位置以外的其他值。在mousemove处理程序中,您必须获得相对于父对象的位置。另外,确保父元素是画布而不是网格。图像上有相当大的左上边缘,还有一个变量名为“thegrid”的控件。