🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
7 messages
7 total messages Started by Paweł Mon, 12 Aug 2013 12:49
Drag and drop w WPF
#22482
Author: Paweł
Date: Mon, 12 Aug 2013 12:49
109 lines
5235 bytes
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
Re: Drag and drop w WPF
#22483
Author: Paweł
Date: Tue, 13 Aug 2013 08:44
1 lines
1072 bytes
Jakieś pomysły ?
Re: Drag and drop w WPF
#22484
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 13 Aug 2013 15:49
19 lines
1598 bytes
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.
Re: Drag and drop w WPF
#22485
Author: Paweł
Date: Wed, 14 Aug 2013 10:58
18 lines
1830 bytes
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ł
Re: Drag and drop w WPF
#22486
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 14 Aug 2013 16:16
21 lines
1597 bytes
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.

-- 
Pozdrawiam,
Łukasz 'Mały' Ostrowski.
Re: Drag and drop w WPF
#22487
Author: Pawel
Date: Wed, 14 Aug 2013 21:04
38 lines
2778 bytes
W dniu 2013-08-14 18:16, Łukasz 'Maly' Ostrowski pisze:
> 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.
>

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ł
Re: Drag and drop w WPF
#22488
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 15 Aug 2013 08:24
39 lines
2380 bytes
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 :).

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

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads