wpf drag and drop

326
01 июня 2017, 06:13

wpf пытаюсь перетащить одну картинку и дропнуть её в другой блок image.

При нажатии на картинку с котом вызывается mousedown и следующий код

private void GetImage(object sender, MouseButtonEventArgs e)
    {
        Image lbl = sender as Image;
        global_sender = lbl;
        DragDrop.DoDragDrop(lbl, lbl.Source, DragDropEffects.Copy);
    }

Затем при дропе вызывается след. код(только видимо не вызывается)

private void DropImage(object sender, DragEventArgs e)
    {
        ((Image)sender).Source = global_sender.Source;
    }

 private void Image_DragEnter(object sender, DragEventArgs e)
    {
        e.Effects = DragDropEffects.Copy;
    }

Не могу найти ошибку

ну и xaml

<Grid>
    <TextBox HorizontalAlignment="Left" Height="38" Margin="623,26,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="128"/>
    <Button Content="Назад" HorizontalAlignment="Left" Margin="42,385,0,0" VerticalAlignment="Top" Width="104" Height="36" Click="BackPage"/>
    <ListBox x:Name="ClothList" HorizontalAlignment="Left" Height="368" Margin="18,12,0,0" VerticalAlignment="Top" Width="150" ScrollViewer.HorizontalScrollBarVisibility="Disabled" MouseDown="GetImage"/>
    <Border BorderThickness="1" BorderBrush="Black" Margin="317,82,321,240">
        <Image x:Name="Imagehead" HorizontalAlignment="Left" Height="108" Margin="-1" VerticalAlignment="Top" Width="123" AllowDrop="True" Drop="DropImage" DragEnter="Image_DragEnter"/>
    </Border>
    <Image x:Name="CatImage" Source="cat.png" HorizontalAlignment="Left" Height="99" VerticalAlignment="Top" Width="132" Margin="504,82,0,0" MouseDown="GetImage"/>
</Grid>`
Answer 1

Проблема в том, что элемент Image, на который должный дропится данные - прозрачный для мыши. Один из вариантов - дропить на Border и поставить ему какой-нибудь Background (например, White) но применять картинку к его ребенку:

<Border BorderThickness="1" BorderBrush="Black" Background="White" AllowDrop="True" Drop="DropImage">
    <Image Height="108" Width="123" />
</Border>
<Image Source="cat.png" Height="99" Width="132" MouseDown="GetImage" />

В таком случае драггинг должен выглядеть как:

private void GetImage(object sender, MouseButtonEventArgs e)
{
    var image = (Image)sender;
    var data = new DataObject(typeof(ImageSource), image.Source);
    DragDrop.DoDragDrop(image, data, DragDropEffects.Copy);
}
private void DropImage(object sender, DragEventArgs e)
{
    var border = (Border)sender;
    var image = (Image)border.Child;
    image.Source = (ImageSource)e.Data.GetData(typeof(ImageSource));
}

Для дальнейшего обучения я бы вам порекомендовал изучить паттерн MVVM. С помощью него и Behavior-ов можно сделать более красивое Drag&Drop решение.

READ ALSO
Изменение размеров окна при FormBorderStyle: None в C#

Изменение размеров окна при FormBorderStyle: None в C#

В общем, создал форму, в свойствах формы FormBorderStyle указал None, чтобы не было рамки окна и заголовкаСобственно, вопрос: как теперь сделать так,...

429
Обработка больших данных с помощью Linq

Обработка больших данных с помощью Linq

Есть база данных около 500000 записейЯ ее вывел, через jquery datatables, на вебморду

289
Как получить результат запроса COUNT(*)

Как получить результат запроса COUNT(*)

Не знаю, откуда получить нужное мне значениеМетод ниже

356
Вывести несколько таблиц из DataSet на DataGrid

Вывести несколько таблиц из DataSet на DataGrid

Есть WPF приложение, в классе DAL которого реализуется чтение данных из БД и запись полученной таблицы в DataSet, в класс StorageТаблицы точно попадают...

297