Piccola Gallery WPF

lunedì 25 luglio 2011 - 21.01
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010

xgeneralex Profilo | Newbie

Ciao a tutti ragazzi!
Vorrei un aiuto per quanto riguarda la creazione di una semplice galleria di immagini all'interno della mia applicazione.Ho tanta confusione in testa, ma non riesco a trovare un esempio semplice semplice che faccia due cose:

-Raccolga le immagini da una cartella di cui ho il percorso settato nelle impostazioni (solo le .jpg)
-Me le mostri in una listbox o in un wrappanel etc come delle thumbnail...
-Posso cliccarle per richiamare la riproduzione di un video.

Una specie di galleria anteprima per la riproduzione video insomma.

Il tutto in wpf...

AlessioElia Profilo | Newbie

Innanzitutto devi settare le proprietà del listbox per poter contenere delle immagini:

<ListBox Name="lbFoto"> <ListBox.ItemTemplate> <DataTemplate> <Image Stretch="Fill" Width="100" Height="100" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

Dopodichè devi crearti una lista di Bitmap Image da associare al ListBox contenente tutte le immagini

List<BitmapImage> pictures = new List<BitmapImage>(); DirectoryInfo pictureImageDir = new DirectoryInfo(percorso); foreach (FileInfo imageFile in pictureImageDir.GetFiles("*.jpg")) { Uri uri = new Uri(imageFile.FullName); pictures.Add(new BitmapImage(uri)); } lbFoto.ItemsSource = pictures;

Cosi dovrebbe gia funzionare..


xgeneralex Profilo | Newbie

Alessio grazie innanzitutto per la celere risposta.
La tua soluzione mi sembra corretta e semplice, ma purtroppo non capisco perchè mi apre la finestra della galleria ma non mi mostra nulla...L'xaml l'ho lasciato come mi hai suggerito, e questo è il file .cs

xaml:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

forse commetto qualche errore banale...

AlessioElia Profilo | Newbie

Prova a mettere un punto di interruzione quando fai lbFoto.itemsSource=.... Verifica che il Count di pictures sia maggiore di zero.

Prova anche a sostituire questa riga qui

<Image Stretch="Fill" Width="100" Height="100" />

con questa riga qui

<Image Source="{Binding Path=UriSource}" Stretch="Fill" Width="100" Height="100" />

xgeneralex Profilo | Newbie

Funziona Alessio....Ho commesso un errore davvero stupido nelle dichiarazioni mettendo void gallery...(sono uno scemo :))

Adesso il prossimo passo è rendere cliccabili le immagini e passare il percorso per visualizzare il video relativo all'immagine...

AlessioElia Profilo | Newbie

Beh un'idea semplice e stupida è gestire l'evento SelectionChanged del tuo ListBox!
Le mie esperienze possono aiutarti fino a qui :)
Sono curioso anche io della risoluzione di questo quesito perchè dovrei aggiungerlo ad una mia applicazione.
Buon lavoro!

xgeneralex Profilo | Newbie

Si infatti ci ho pensato adesso. Un'ultima cosa, gli elementi vengono sistemati come 1 elemento 1 riga, c'è un modo di sistemarli come tiles? tipo piastrelle selezionabili?
Grazie mille!
Buon lavoro anche a te!

AlessioElia Profilo | Newbie

Guarda di per certo so che dovresti modificare la proprietà itemspanel del listbox.

Io ho preso spunto da questo post:
http://www.codeproject.com/KB/WPF/CustomListBoxLayoutInWPF.aspx

solo che non funziona.. Forse sbaglio qualcosa!

Io ho provato a scrivere così
<listbox......> <ItemsPanel> <ItemsPanelTemplate> <WrapPanel/> </ItemsPanelTemplate> </ItemsPanel> </listbox>

xgeneralex Profilo | Newbie

Ho risolto -adesso vengono disposte in orizzontale.

xaml (devi sostituire il namespace nel local)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra




il .cs (devi sostiuire solo il nome della classe e la cartella di destinazione)
public partial class Galleria : Window { public Galleria() { InitializeComponent(); } } public static class VideoImgLoader { public static List<BitmapImage> LoadImages() { Preferenze p = new Preferenze(); string destinazione; destinazione = p.destvideo; List<BitmapImage> pictures = new List<BitmapImage>(); DirectoryInfo pictureImageDir = new DirectoryInfo(destinazione); //int count=0; foreach (FileInfo imageFile in pictureImageDir.GetFiles("*.jpg")) { Uri uri = new Uri(imageFile.FullName); pictures.Add(new BitmapImage(uri));

Avevo risolto anche la selezione delle foto e ottenuto il loro percorso per passarlo ad un metodo del main, però adottando quest'altro metodo adesso non so più come richiamare l'evento selected changed:

.
.
.
listboxFoto.ItemsSource = pictures;
listboxFoto.SelectionChanged += lbFoto_SelectionChanged;
}

void lbFoto_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var selected in lbFoto.SelectedItems)
{
-------------------------

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5