如何在WPF中平滑拖动图像框?

时间:2011-01-26 00:06:41

标签: wpf vb.net image drag-and-drop

我正在使用WPF 4和VB.net 2010.我的项目包括全屏幕窗口,中间有一个640x480网格。

在这个项目中,我希望有各种图像框(其中包含项目.png图像),用户可以拖动并放在网格上的各个位置。

本质上,我需要能够在网格上点击和拖动项目,图像框仍然可见,并且大小与用户移动它相同。它应该永远不能离开网格。我还需要能够确定对象是否在另一个对象上,因此当释放鼠标按钮时,拖动的对象被“删除”,并触发特定的代码块。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

类似于您的“项目”,但使用C#

来自http://pastie.org/1498237

// XAML

<Window x:Class="MyProject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="500" Width="500">
    <Grid>
        <Canvas x:Name="mycanv">
            <Image Width="150" x:Name="myimg" Source="some_source.png"/>
        </Canvas>
    </Grid>
</Window>

//C#

private Point mouseClick;
private double canvasLeft;
private double canvasTop;
public Window1()
{
    InitializeComponent();
    foreach (object obj in mycanv.Children)
    {
        try
        {
            Image img = (Image)obj;
            img.PreviewMouseDown += new MouseButtonEventHandler(myimg_MouseDown);
            img.PreviewMouseMove += new MouseEventHandler(myimg_MouseMove);
            img.PreviewMouseUp += new MouseButtonEventHandler(myimg_MouseUp);
            img.TextInput += new TextCompositionEventHandler(myimg_TextInput);
            img.LostMouseCapture += new MouseEventHandler(myimg_LostMouseCapture);
            img.SetValue(Canvas.LeftProperty, 0.0);
            img.SetValue(Canvas.TopProperty, 0.0);
        }
        catch
        {
            //do something
        }
    }
}

void myimg_LostMouseCapture(object sender, MouseEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_TextInput(object sender, TextCompositionEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_MouseUp(object sender, MouseButtonEventArgs e)
{
    ((Image)sender).ReleaseMouseCapture();
}

void myimg_MouseMove(object sender, MouseEventArgs e)
{
    if (((Image)sender).IsMouseCaptured)
    {
        Point mouseCurrent = e.GetPosition(null);
        double Left = mouseCurrent.X - canvasLeft;
        double Top = mouseCurrent.Y - canvasTop;
        ((Image)sender).SetValue(Canvas.LeftProperty, canvasLeft + Left);
        ((Image)sender).SetValue(Canvas.TopProperty, canvasTop + Top);
        canvasLeft = Canvas.GetLeft(((Image)sender));
        canvasTop = Canvas.GetTop(((Image)sender));
    }
}

void myimg_MouseDown(object sender, MouseButtonEventArgs e)
{
    mouseClick = e.GetPosition(null);
    canvasLeft = Canvas.GetLeft(((Image)sender));
    canvasTop = Canvas.GetTop(((Image)sender));
    ((Image)sender).CaptureMouse();
}