none
DataBinding gridview avec un controle image RRS feed

  • Question

  • Bonjour a tous,

    Je profite de l'arrivée de Windows 8 pour me mettre a WPF et aux applications Windows Store. Pour l'instant je me suis fait une petite appli de test comme une bibliothèque d'images avec plusieurs dossiers que choisi l'utilisateur (via un FolderPicker), l'appli scan les différents dossiers choisis puis affiche tous les fichiers images dans un gridview personnalisé.

    Mon appli fonctionne "relativement" bien, le binding est bon, les filenames sont bien retournés et l'ensemble des images est bien pris en compte, cependant le control Image n'affiche jamais l'image alors que la propriété "Source" semble être bindé correctement. Merci d'avance de votre soutien dans ma grande quête sur WPF xD

    Page XAML:

    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:myMediaCenter"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Primitives="using:Telerik.UI.Xaml.Controls.Primitives"
        x:Class="myMediaCenter.imagesPage"
        mc:Ignorable="d">
    	<Page.Resources>
    		<DataTemplate x:Key="gridViewItemDataTemplate">
    			<Grid Width="200" Height="200">
                    <Image x:Name="img" Source="{Binding filepath}" HorizontalAlignment="Left" Height="200" VerticalAlignment="Top" Width="200"/>
    				<Rectangle Fill="#4C000000" HorizontalAlignment="Left" Height="34" Margin="0,166,0,0" Stroke="Black" VerticalAlignment="Top" Width="200"/>
    				<TextBlock x:Name="filename" HorizontalAlignment="Left" Height="24" Margin="10,166,0,0" TextWrapping="Wrap" Text="{Binding filename}" VerticalAlignment="Top" Width="180"/>
    				<Border BorderBrush="#FF230303" BorderThickness="1" HorizontalAlignment="Left" Height="200" VerticalAlignment="Top" Width="200"/>
    			</Grid>
    		</DataTemplate>
    	</Page.Resources>
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="11*"/>
                <RowDefinition Height="117*"/>
            </Grid.RowDefinitions>
            <TextBlock x:Name="txtImagesTitle" HorizontalAlignment="Left" Height="70" Margin="10,10,0,0" TextWrapping="Wrap" Text="Images" VerticalAlignment="Top" Width="700" FontSize="36" FontFamily="Segoe UI" Foreground="#FFCDCDCD" Grid.RowSpan="2"/>
            <Button x:Name="btnBrowseFolders" Content="Button" HorizontalAlignment="Left" Margin="1135,18,0,0" VerticalAlignment="Top" Click="btnBrowseFolders_Click"/>
            <GridView x:Name="imagesGridView" HorizontalAlignment="Left" VerticalAlignment="Top" Width="1215" Height="599" Margin="0,61,0,0" Grid.RowSpan="2" ItemsSource="{Binding}" ItemTemplate="{StaticResource gridViewItemDataTemplate}"  />
        </Grid>
    </Page>


    Code behind

    // classe que j'utilise pour créer mes objets 
    namespace myMediaCenter
    {
        class filePath
        {
            public string filename { get; set; }
            public string filepath { get; set; }
        }
    }
    
    // collection de données
    private ObservableCollection<filePath> filesCollection = new ObservableCollection<filePath>();
    
    // partie récupérant les fichiers du nouveau dossier choisi puis l'ajoutant a la collection
    var folder = await folderPicker.PickSingleFolderAsync();
    
    if (folder != null){
    var items = await folder.GetFilesAsync();
        foreach (var f in items){
        filePath fp = new filePath();
        fp.filename = f.Name;
        fp.filepath = f.Path;
        this.filesCollection.Add(fp);
        }
    }


    AppManifest modifié pour avoir accès au systeme de fichier

          <Extensions>
          <Extension Category="windows.fileTypeAssociation">
            <FileTypeAssociation Name="data">
              <EditFlags AlwaysUnsafe="true" />
              <SupportedFileTypes>
                <FileType>.jpg</FileType>
                <FileType>.png</FileType>
              </SupportedFileTypes>
            </FileTypeAssociation>
          </Extension>      
          </Extensions>
        </Application>
      </Applications>
      <Capabilities>
        <Capability Name="musicLibrary" />
        <Capability Name="documentsLibrary" />
        <Capability Name="videosLibrary" />
        <Capability Name="picturesLibrary" />
        <Capability Name="internetClient" />
      </Capabilities>

    Merci d'avance.

    mercredi 26 septembre 2012 08:56

Réponses

Toutes les réponses

  • Bonjour,

      Etes-vous sur de bien récupérer la bonne valeur via la propriété Path ?

      Dans la documentation de la propriété StorageFile.Path, il est dit qu'il n'est pas garanti dans le cas d'un file picker d'avoir un chemin :

      http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.path.aspx

    mercredi 26 septembre 2012 10:10
  • Bonjour,

      Etes-vous sur de bien récupérer la bonne valeur via la propriété Path ?

      Dans la documentation de la propriété StorageFile.Path, il est dit qu'il n'est pas garanti dans le cas d'un file picker d'avoir un chemin :

      http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.path.aspx

    Effectivement dans certains cas notamment certains special folder, la propriété path n'est pas définie.

    Tu peux envisager de charger directement ton image depuis ton code par exemple en utilisant BitmapImage.SetSourceAsync(IRandomAccessStream).


    Cyprien Autexier

    mercredi 26 septembre 2012 13:04
  • j'ai tenté de faire un messageDialog après l'insertion dans la collection histoire de voir, dans les trois cas testés

    C:\Users\[monUser]\Documents
    C:\Users\[monUser]\Test
    C:\Test\TestF\TestToto

    assez étrange :s, je vais essayer avec SetSourceAsync :s, cependant cela pourrait t'il venir plutot d'un problème de droit de l'application a mon systême de fichiers?

    mercredi 26 septembre 2012 15:26
  • Re,

    Je viens de faire le test en rajoutant une propriété BitmapImage a ma classe de base et en faisant un truc du genre pour l'ajout d'items dans le gridview tout en faisant un binding de ma propriété Source du controle Image sur ma nouvelle propriété img et résultat ca marche!

    var folderPicker = new FolderPicker();
    folderPicker.FileTypeFilter.Add("*");
    folderPicker.ViewMode = PickerViewMode.List;
    folderPicker.SuggestedStartLocation = PickerLocationId.HomeGroup;
    folderPicker.SettingsIdentifier = "FolderPicker";
    
    var folder = await folderPicker.PickSingleFolderAsync();
    
    if (folder != null)
    {
    	var items = await folder.GetFilesAsync();
    	foreach (var f in items)
    	{
    		IRandomAccessStream fs = await f.OpenAsync(Windows.Storage.FileAccessMode.Read);
    		BitmapImage img = new BitmapImage();
    		await img.SetSourceAsync(fs);
    
    		filePath fp = new filePath();
    		fp.filename = f.Name;
    		fp.filepath = f.Path;
    		fp.img = img;
    
    		this.filesCollection.Add(fp);
    	}
    }

    Il me reste cependant un problème:

     Ce code ne sert en thérorie que quand l'utilisateur ajoute un dossier a la liste de ceux a scanner. Dans l'idéal j'ajoute le nouveau path a un fichier de paramètres et le reste du temps je récupère les dossiers que j'ai dans mon fichier de paramètres et je les rescan tous pour faire le meme truc.

    Mon soucis est qu'après la configuration par l'utilisateur, tous les chemins seront des chemins absolus du type C:\... et non pas des StorageFolder. Ma question est: comment obtenir des éléments StorageFolder a partir de mon URI absolue pour pouvoir faire un code similaire a celui du dessus?

    Merci d'avance.


    mercredi 26 septembre 2012 20:00
  • Tu as la fonction StorageFolder.GetFolderFromPathAsync qui devrait faire ce que tu veux :

    http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefolder.getfolderfrompathasync.aspx#Y135

    mercredi 26 septembre 2012 20:13
  • Bien joué ca fonctionne a merveille :) même si les Windows Forms me manquent un peu je commence a me débrouiller un minimum (heureusement que l'aide sur les forums MSDN est de qualité ;)

    Merci encore.

    mercredi 26 septembre 2012 22:32