Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Drag and drop w WPF

17 views
Skip to first unread message

Paweł

unread,
Aug 12, 2013, 8:49:42 AM8/12/13
to
Czesc

Mam problem z prawidłowym użyciem mechanizmu Drag and Drop w swoim
programie. Otóż w kodzie xaml mam:

<ListView Grid.Column="0" Grid.Row="1" Height="200" Margin="2"
Name="lvListaWczytanychPlikowFotek" ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Border BorderBrush="Bisque"
BorderThickness="2" CornerRadius="5" Margin="5">
<Image Margin="5"
Source="{Binding .Foto}" Height="170" Width="150"
MouseLeftButtonDown="DragImage" />
</Border>
<StackPanel>
<TextBlock
Name="tbNazwaPliku" Text="{Binding .NazwaPliku}" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

[...]

<StackPanel Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Margin="5"
Background="Transparent">
<TextBlock>Fotografia 1:</TextBlock>
<Border BorderThickness="2" Margin="2" BorderBrush="Beige">
<Image MinWidth="200" MinHeight="200" AllowDrop="True"
Drop="DropImageFoto" Name="image1foto" Stretch="UniformToFill"></Image>
</Border>
</StackPanel>

W kodzie zaś, mam klasę:

public class Fotografia
{
public string NazwaPliku { get; set; }
public string SciezkaDoPliku { get; set; }
public ImageSource Foto { get; set; }

public Fotografia()
{

}

public Fotografia(string _nazwaPliku, string
_sciezkaDoPliku, ImageSource _foto)
{
this.NazwaPliku = _nazwaPliku;
this.SciezkaDoPliku = _sciezkaDoPliku;
this.Foto = _foto;
}
}
i obiekt:

public ObservableCollection<Fotografia> listaWczytaneFotki = new
ObservableCollection<Fotografia>();

do którego są pobierane pliki

listaWczytaneFotki.Add(new Fotografia{NazwaPliku =
System.IO.Path.GetFileName(file), SciezkaDoPliku =
System.IO.Path.GetFullPath(file),Foto = (new
ImageSourceConverter()).ConvertFromString(file) as ImageSource });

Teraz chcę móc przeciągać obrazek z kontrolki ListView
(lvListaWczytanychPlikowFotek) na kontrolkę Image(image1foto), tak aby
on się w niej wyświetlił:

private void DragImage(object sender, MouseButtonEventArgs e)
{
//Image image = e.Source as Image;
//DataObject data = new DataObject(typeof(ImageSource),
image.Source);
//DragDrop.DoDragDrop(image, data, DragDropEffects.Copy);
//e.Handled = true;

Fotografia current =
(Fotografia)lvListaWczytanychPlikowFotek.Items.CurrentItem;
ImageSource data = current.Foto;
DragDrop.DoDragDrop(lvListaWczytanychPlikowFotek, data,
DragDropEffects.Copy);
e.Handled = true;
}

private void DropImageFoto(object sender, DragEventArgs e)
{

Fotografia brFoto = e.Data.GetData(typeof(Fotografia)) as
Fotografia;
Image imageControl = new Image() { Width =
image1foto.Width, Height = image1foto.Height, Source = brFoto.Foto };
imageControl.Stretch = Stretch.UniformToFill;
this.image1foto.Source = imageControl.Source;
e.Handled = true;

}

Na chwilę obecną obrazki w ListView się ładnie wyświetlają, w momencie
rozpoczęcia przeciągania wybranej fotografii kursor myszy zmienia
kształt ale nie wykonuje się fragment kodu związany z metodą
DropImageFoto. Co pominęłem że ten kod nie działa prawidłowo ?

Z góry dzięki za podpowiedź. Pozdrawiam

Paweł

unread,
Aug 13, 2013, 4:44:27 AM8/13/13
to
Jakieś pomysły ?

Łukasz 'Maly' Ostrowski

unread,
Aug 13, 2013, 11:49:05 AM8/13/13
to
On Mon, 12 Aug 2013 14:49:42 +0200, Paweł wrote:
> Mam problem z prawidłowym użyciem mechanizmu Drag and Drop w swoim
> programie. Otóż w kodzie xaml mam:
>
> <snip>
>
> Na chwilę obecną obrazki w ListView się ładnie wyświetlają, w momencie
> rozpoczęcia przeciągania wybranej fotografii kursor myszy zmienia
> kształt ale nie wykonuje się fragment kodu związany z metodą
> DropImageFoto. Co pominęłem że ten kod nie działa prawidłowo ?

Nie jestem wielkim specjalistą WPF, ale jak wrzucisz
kompilowalny projekt to zajrzę dzisiaj/jutro. Nie
przesadnie chce mi się 200 linii kodu i markupu
ręcznie składać w kompilowalną całość ;-).

--
Pozdrawiam,
Łukasz 'Mały' Ostrowski.

Paweł

unread,
Aug 14, 2013, 6:58:01 AM8/14/13
to
On 2013-08-13 17:49, Łukasz 'Maly' Ostrowski wrote:
> On Mon, 12 Aug 2013 14:49:42 +0200, Paweł wrote:
>> Mam problem z prawidłowym użyciem mechanizmu Drag and Drop w swoim
>> programie. Otóż w kodzie xaml mam:
[...]
> Nie jestem wielkim specjalistą WPF, ale jak wrzucisz
> kompilowalny projekt to zajrzę dzisiaj/jutro. Nie
> przesadnie chce mi się 200 linii kodu i markupu
> ręcznie składać w kompilowalną całość ;-).
>

Z góry dzięki za pomoc

Pod tym plikiem znajduje się projekt VS2010

http://www.gg.pl/dysk/NdvtjPMZf-yxNNvtjPMZQAI/FotografieWpf.zip

Pozdrawiam Paweł

Łukasz 'Maly' Ostrowski

unread,
Aug 14, 2013, 12:16:22 PM8/14/13
to
On Wed, 14 Aug 2013 12:58:01 +0200, Paweł wrote:
> Pod tym plikiem znajduje się projekt VS2010
>
> http://www.gg.pl/dysk/NdvtjPMZf-yxNNvtjPMZQAI/FotografieWpf.zip

Zajrzałem, wygląda na to że Image, lub też pusty Image,
nie jest rozpoznawany jako valid-drop-target. Najłatwiejsze
obejście to ustawić drag&drop na parent'a, czyli na
StackPanel z Labelem+Image. Zmiany które zrobiłem:

1. http://pastebin.com/7j1Wz0FT - xaml.cs
Głównie kosmetycznie tutaj, ale zajrzyj, żadnych
rewelacji w każdym razie.
2. http://pastebin.com/KfW6AhPL - xaml.

Sprawdzone, działa. Później/jutro zajrzę sam z ciekawości
czemu nie mogę ustawić Image jako target D&D.

Pawel

unread,
Aug 14, 2013, 5:04:34 PM8/14/13
to
W dniu 2013-08-14 18:16, Łukasz 'Maly' Ostrowski pisze:
Dzięki wielkie za pochylenie się nad moimi bazgrołami.
Ale mam pytanko ponieważ trochę to źle działa, gdyż zawsze do docelowego
image wstawia się tylko 1 obrazek z wczytanych do ListView, nawet za
pierwszym razem wybierając 5 obrazek z wczytanych wstawi się pierwszy z
listy. Dlaczego ?
Po drugie zastanawia mnie dlaczego nie działa bindowanie do elementu
.NazwaPliku chociaż dla .Foto już tak ?

<StackPanel Orientation="Vertical">
<Border BorderBrush="Black">
<Image Margin="5" Source="{Binding .Foto}" />
</Border>
<StackPanel>
<TextBlock Text="{Binding .NazwaPliku}" />
</StackPanel>
</StackPanel>

Dziękuję i pozdrawiam Paweł

Łukasz 'Maly' Ostrowski

unread,
Aug 15, 2013, 4:24:33 AM8/15/13
to
On Wed, 14 Aug 2013 23:04:34 +0200, Pawel wrote:
> Ale mam pytanko ponieważ trochę to źle działa, gdyż zawsze do docelowego
> image wstawia się tylko 1 obrazek z wczytanych do ListView, nawet za
> pierwszym razem wybierając 5 obrazek z wczytanych wstawi się pierwszy z
> listy. Dlaczego ?

Fotografia current =
(Fotografia)lvListaWczytanychPlikowFotek.Items.CurrentItem;

Ponieważ zawsze zaznaczoną fotkę wybierasz do dragowania, a nie
"dragowaną"/"wybraną pozycją myszki". Tego nie weryfikowałem(*),
taki strzał. Kliknij i dopiero przeciągaj zaznaczone elementy
żeby to zweryfikować.

*) Już poprawioną solucję wywaliłem, nie chce mi się znowu
poprawiać ;-).

> Po drugie zastanawia mnie dlaczego nie działa bindowanie do elementu
> .NazwaPliku chociaż dla .Foto już tak ?
>
> <StackPanel Orientation="Vertical">
> <Border BorderBrush="Black">
> <Image Margin="5" Source="{Binding .Foto}" />
> </Border>
> <StackPanel>
> <TextBlock Text="{Binding .NazwaPliku}" />
> </StackPanel>
> </StackPanel>

Działa bindowanie, to scrollowanie tego ListView dziwnie
się zachowuje, jeżeli zmienisz to na Orientation na Horizontal,
lub powiększysz ListView, to nazwy plików się pojawią.

p.s. Powalcz z UI, bo jest siermiężne, niech się skaluje z
wielkościa formy przynajmniej :).
0 new messages