drag & drop image WPF

228
06 апреля 2017, 16:27

Подскажите, в чем ошибка. Хочу чтобы с помощью drag&drop вставляло картинку, но после перетаскивания получаю объект Image со свойством Source равным null

XAML

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="300"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.RowSpan="2">
        <StackPanel CanVerticallyScroll="True">
            <Image Source="Resources/part1.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
            <Image Source="Resources/part2.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
            <Image Source="Resources/part3.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
            <Image Source="Resources/part4.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
            <Image Source="Resources/part5.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
            <Image Source="Resources/part6.jpg" Width="280" Height="121" Margin="0,10,0,10" MouseDown="Image_MouseDown" Stretch="UniformToFill"/>
        </StackPanel>
    </ScrollViewer>
    <Canvas Grid.Column="1" Margin="0,0,0,0" >
        <Image Source="Resources/part1.jpg" Width="280" Height="120" Drop="Image_Drop" DragEnter="Image_DragEnter" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="156" Canvas.Top="51"/>
        <Image Source="Resources/part2.jpg" Width="280" Height="120" Drop="Image_Drop" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="436" Canvas.Top="51"/>
        <Image Source="Resources/part3.jpg" Width="280" Height="120" Drop="Image_Drop" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="156" Canvas.Top="170"/>
        <Image Source="Resources/part4.jpg" Width="280" Height="120" Drop="Image_Drop" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="436" Canvas.Top="170"/>
        <Image Source="Resources/part5.jpg" Width="280" Height="120" Drop="Image_Drop" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="156" Canvas.Top="288"/>
        <Image Source="Resources/part6.jpg" Width="280" Height="120" Drop="Image_Drop" AllowDrop="True" Stretch="UniformToFill" Canvas.Left="436" Canvas.Top="288"/>
    </Canvas>
</Grid>

C#

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Image_Drop(object sender, DragEventArgs e)
    {
        ((Image) sender).Source = e.Source as ImageSource;
    }
    private void Image_MouseDown(object sender, MouseButtonEventArgs e)
    {
        // sender – объект, на котором произошло данное событие.
        Image lbl = sender as Image;
        // Создаем источник.
        // Копируем содержимое метки Drop.
        // 1 параметр: Элемент управления, который будет источником.
        // 2 параметр: Данные, которые будут перемещаться.
        // 3 параметр: Эффект при переносе.
        DragDrop.DoDragDrop(lbl, lbl.Source, DragDropEffects.Copy);
    }
    private void Image_DragEnter(object sender, DragEventArgs e)
    {
        e.Effects = DragDropEffects.Copy;
    }
}

ссылка на гит https://github.com/Sechik/Puzzle

Answer 1

У тебя Source разные(ты их пытаешся присвоить):

{pack://application:,,,/Puzzle;component/Resources/part3.jpg}
{System.Windows.Controls.Image}

Так происходит копирование, но картинка одна и та же в sender и e

private void Image_Drop(object sender, DragEventArgs e)
    {
        //((Image) sender).Source = e.Source as ImageSource;
        Image image = e.Source as Image;
        ((Image)sender).Source = image.Source;
    }

Вот готовое решение (здесь картинка передаётся через дополнительную переменную):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Puzzle
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static Image global_sender;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Image_Drop(object sender, DragEventArgs e)
        {
            //((Image) sender).Source = e.Source as ImageSource;
            //Image image = e.Source as Image;
            //((Image)sender).Source = image.Source;
            ((Image)sender).Source = global_sender.Source;
        }
        private void Image_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // sender – объект, на котором произошло данное событие.
            Image lbl = sender as Image;
            global_sender = lbl;
            // Создаем источник.
            // Копируем содержимое метки Drop.
            // 1 параметр: Элемент управления, который будет источником.
            // 2 параметр: Данные, которые будут перемещаться.
            // 3 параметр: Эффект при переносе.
            DragDrop.DoDragDrop(lbl, lbl.Source, DragDropEffects.Copy);
        }
        private void Image_DragEnter(object sender, DragEventArgs e)
        {
            e.Effects = DragDropEffects.Copy;
        }
    }
}

READ ALSO
Передача файлов с использованием TCP Socket - C#

Передача файлов с использованием TCP Socket - C#

Доброго времени сутокВозникла проблема при попытке передать файл с помощью сокетов

1319
Настройка Browser-sync для PHP (Apache)

Настройка Browser-sync для PHP (Apache)

Не получается сделать так, чтобы браузер перезагружал страницы из папки Example при их измененииУ меня стоит сборка Xampp (Apache)

434
VK API загрузка фото

VK API загрузка фото

При отправке multipart/form-data по полученному url, запрос

503
Сумма элементов подмассива

Сумма элементов подмассива

В переменной лежит такой массив

275