2

Есть listbox который содержит изображения, и canvas в качестве поля для перетаскивания, объясните мне, как добавить drag and drop для картинок,чтобы разместить их на canvas и слепить из них одно изображение по нажатию кнопки.окно программы Заполнение listbox:

CClothContext db = new CClothContext();
var ClList = db.Clothe.ToList();
foreach (var num in ClList)
{
    Image img = new Image();
    img.Source = byteArrayToImage(num.Cloth_img).Source;
    ClothList.Items.Add(img);
}
  • Это сложная задача. Посмотрите вот сюда: https://ru.stackoverflow.com/q/591337/10105 Работы у вас очень много, поздравляю. – VladD May 30 '17 at 22:32
  • А нет способа без mvvm? – alexander May 30 '17 at 23:04
  • Есть, но без MVVM сложнее. – VladD May 30 '17 at 23:05
  • Просто уже нет времени переносить все приложение на mvvm – alexander May 30 '17 at 23:07
  • Ну, без опыта выполнить это задание быстро всё равно не выйдет. Так что если времени реально нет, бегите от этого задания подальше. – VladD May 30 '17 at 23:08
  • Еще раз спасибо за помощь;) – alexander May 30 '17 at 23:12

1 Answers1

3

Можно сделать так: xaml code

    <Grid AllowDrop="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ListBox x:Name="listBox_main" Grid.Column="0" PreviewMouseDown="listBox_main_PreviewMouseDown" SelectionMode="Multiple">
                &lt;Image Source=&quot;Resources\1.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;
            &lt;Image Source=&quot;Resources\2.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;
            &lt;Image Source=&quot;Resources\3.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;
            &lt;Image Source=&quot;Resources\4.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;
            &lt;Image Source=&quot;Resources\5.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;
    &lt;/ListBox&gt;

    &lt;Canvas AllowDrop=&quot;True&quot; Background=&quot;Transparent&quot; x:Name=&quot;canvas_main&quot; Grid.Column=&quot;1&quot; DragEnter=&quot;canvas_main_DragEnter&quot; Drop=&quot;canvas_main_Drop&quot;

     &gt;
        &lt;Image Source=&quot;Resources\5.jpg&quot; Stretch=&quot;Uniform&quot; Height=&quot;100&quot; Width=&quot;100&quot;&gt;&lt;/Image&gt;

    &lt;/Canvas&gt;
&lt;/Grid&gt;

Code:

    private void canvas_main_DragEnter(object sender, DragEventArgs e)
    {
        // Если пользователь копирует объект перетаскиванием и это список файлов и это не перетаскивание из listBox в него же
        if (e.Data.GetDataPresent("MyappformatBitmapSource") &&
            (e.AllowedEffects & DragDropEffects.Copy) != 0)
        {
            // Разрешить копирование
            e.Effects = DragDropEffects.Copy;
        }
    }
private void canvas_main_Drop(object sender, DragEventArgs e)
{
    // Если перетаскивается картинка
    if (e.Data.GetDataPresent(&quot;MyappformatBitmapSource&quot;))
    {
        foreach (BitmapSource bSource in (BitmapSource[])e.Data.GetData(&quot;MyappformatBitmapSource&quot;))
        {                    // Показать картинку
            Image new_image = new Image()
            {
                Source=bSource,
                Stretch = Stretch.Uniform,
                Width=100,
                Height=100
            };
            canvas_main.Children.Add(new_image);
            Canvas.SetLeft(new_image, 100);
            Canvas.SetTop(new_image, 100);
        }
    }
}

private void listBox_main_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{

    // Создать контейнер для хранения данных
    DataObject data = new DataObject();

    if (listBox_main.SelectedItems.Count &lt;= 0)
        return;

    // Положить содержимое выделенной в списке
    BitmapSource[] col = new BitmapSource[listBox_main.SelectedItems.Count];

    for(int i=0;i&lt; listBox_main.SelectedItems.Count;i++)
    {
        if(listBox_main.SelectedItems[i] is Image image)
            col[i]=(BitmapSource)image.Source;
    };

    // Добавить признак пользовательского формата в контейнер
    data.SetData(&quot;MyappformatBitmapSource&quot;,col);

    // НАЧАТЬ перетаскивание программно
    DragDropEffects dde = DragDrop.DoDragDrop(this, data, DragDropEffects.Copy);
}