首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WPF -Drag a image

C# WPF -Drag a image
EN

Stack Overflow用户
提问于 2013-06-11 09:25:45
回答 2查看 14.5K关注 0票数 4

我正在尝试获取一些简单的功能:从文件中获取图像,将其添加到画布中,然后允许用户左键单击(并按住)图像,然后在画布上拖动它(即更新图像的位置)。

这是我到目前为止所拥有的,我应该添加什么?

代码语言:javascript
复制
private void btnAddImage_Click(object sender, RoutedEventArgs e) {
    try {
        System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog();
        open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
        if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
            PictureBox PictureBox1 = new PictureBox();
            PictureBox1.Image = new Bitmap(open.FileName);
            myCanvas.children.add(PictureBox1);
        }
    }
    catch (Exception) { throw new ApplicationException("Failed loading image"); }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-11 16:10:51

您可以将Image控件添加到画布,并在鼠标输入时修改其LeftTop属性。

XAML:

代码语言:javascript
复制
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Canvas x:Name="canvas"
            MouseLeftButtonDown="CanvasMouseLeftButtonDown"
            MouseLeftButtonUp="CanvasMouseLeftButtonUp"
            MouseMove="CanvasMouseMove"/>
    <Button Grid.Row="1" Content="Add Image" Click="AddButtonClick"/>
</Grid>

代码隐藏:

代码语言:javascript
复制
private void AddButtonClick(object sender, RoutedEventArgs e)
{
    var dialog = new Microsoft.Win32.OpenFileDialog();
    dialog.Filter =
        "Image Files (*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";

    if ((bool)dialog.ShowDialog())
    {
        var bitmap = new BitmapImage(new Uri(dialog.FileName));
        var image = new Image { Source = bitmap };
        Canvas.SetLeft(image, 0);
        Canvas.SetTop(image, 0);
        canvas.Children.Add(image);
    }
}

private Image draggedImage;
private Point mousePosition;

private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var image = e.Source as Image;

    if (image != null && canvas.CaptureMouse())
    {
        mousePosition = e.GetPosition(canvas);
        draggedImage = image;
        Panel.SetZIndex(draggedImage, 1); // in case of multiple images
    }
}

private void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (draggedImage != null)
    {
        canvas.ReleaseMouseCapture();
        Panel.SetZIndex(draggedImage, 0);
        draggedImage = null;
    }
}

private void CanvasMouseMove(object sender, MouseEventArgs e)
{
    if (draggedImage != null)
    {
        var position = e.GetPosition(canvas);
        var offset = position - mousePosition;
        mousePosition = position;
        Canvas.SetLeft(draggedImage, Canvas.GetLeft(draggedImage) + offset.X);
        Canvas.SetTop(draggedImage, Canvas.GetTop(draggedImage) + offset.Y);
    }
}
票数 15
EN

Stack Overflow用户

发布于 2013-06-11 09:33:13

您需要通过处理所使用的WPF控件中的拖放路由事件,在代码中添加拖放支持。

如果您使用WPF4.0及以上版本(Visual Studio2010及以上版本),请参阅此.NET拖放Overview的MSDN。

但也请注意正在拖放的是哪种数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17035225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档