none
UWP recharger une image sauvegardée, lors de l'évènement Load de la page RRS feed

  • Question

  • Bonjour, voici la problématique :

    Un button dans une page permet à l'utilisateur de choisir une image sur son PC dans le dossier "Images". Une fois choisis, le chemin d'accès de l'image est sauvegardé dans un fichier texte au sein de la solution pour pouvoir être rechargé à la prochaine ouverture de l'application.

    Mais c'est la que ca coince car j'obtient une erreur de "composant introuvable". Voici les codes :

     private async void LoadImgBtn_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var PickImg1 = new FileOpenPicker()
                {
                    ViewMode = PickerViewMode.List,
                    SuggestedStartLocation = PickerLocationId.PicturesLibrary
                };
                PickImg1.FileTypeFilter.Add(".png");
                PickImg1.FileTypeFilter.Add(".jpeg");
                StorageFile file = await PickImg1.PickSingleFileAsync();
                if (file != null)
                {
                    using (IRandomAccessStream filestream = await file.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage bitmap1 = new BitmapImage();
                        await bitmap1.SetSourceAsync(filestream);
                        Img1.Source = bitmap1;
                        StorageFolder Img1path = ApplicationData.Current.LocalFolder;
                        StorageFile img = await Img1path.CreateFileAsync("Img1Path.txt", CreationCollisionOption.ReplaceExisting);
                        StorageFolder WriteImg1Path = ApplicationData.Current.LocalFolder;
                        StorageFile imgfile = await WriteImg1Path.GetFileAsync("Img1Path.txt"); // C:\Users\collo\Pictures\TestImg1.PNG
                        await FileIO.WriteTextAsync(imgfile, file.Path);
                        Debug.WriteLine(file.Path);
                    }
                }
            }
     private async void CheckImgExists()
            {
                string Img1rootpath = ApplicationData.Current.LocalFolder.Path;
                string Img1filepath = Path.Combine(Img1rootpath, "Img1Path.txt");
                if (File.Exists(Img1filepath))
                {
                    MessageDialog m1 = new MessageDialog("OK");
                    await m1.ShowAsync();
                    StorageFolder getimg1 = ApplicationData.Current.LocalFolder;
                    StorageFile fileimg1 = await getimg1.GetFileAsync("Img1Path.txt");
                    string imageName= await FileIO.ReadTextAsync(fileimg1);
                    using (IRandomAccessStream imgstream = await fileimg1.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage b1 = new BitmapImage();
                        await b1.SetSourceAsync(imgstream);
                        Img1.Source = b1;
    
                    }
    
                }
            }
     
      private void Lapage_Loaded(object sender, RoutedEventArgs e)
            {
                CheckImgExists();
            }




    JF Collombet ® CreateSpecificCulture

    jeudi 27 avril 2017 06:29

Réponses

  • Bonsoir Jean-François,

    Voici le code testé et qui fonctionne chez moi : 

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using System.Threading.Tasks;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.Storage;
    using Windows.Storage.AccessCache;
    using Windows.Storage.Pickers;
    using Windows.Storage.Streams;
    using Windows.UI.Popups;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Media.Imaging;
    using Windows.UI.Xaml.Navigation;
    
    // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
    
    namespace App3
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            String Img1PathTxt = "Img1Path.txt";
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private async void LoadImgBtn_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var PickImg1 = new FileOpenPicker()
                {
                    ViewMode = PickerViewMode.List,
                    SuggestedStartLocation = PickerLocationId.PicturesLibrary
                };
                PickImg1.FileTypeFilter.Add(".png");
                PickImg1.FileTypeFilter.Add(".jpeg");
                StorageFile file = await PickImg1.PickSingleFileAsync();
                if (file != null)
                {
                    using (IRandomAccessStream filestream = await file.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage bitmap1 = new BitmapImage();
                        await bitmap1.SetSourceAsync(filestream);
                        Img1.Source = bitmap1;
                        StorageFolder Img1path = ApplicationData.Current.LocalFolder;
                        StorageFile img = await Img1path.CreateFileAsync(Img1PathTxt, CreationCollisionOption.ReplaceExisting);
                        StorageFile imgfile = await Img1path.GetFileAsync(Img1PathTxt); // C:\Users\collo\Pictures\TestImg1.PNG
                        await FileIO.WriteTextAsync(imgfile, file.Name);
                        Debug.WriteLine(file.Path);
                    }
                }
            }
    
            private async Task CheckImgExists()
            {
                string Img1rootpath = ApplicationData.Current.LocalFolder.Path;
                string Img1filepath = Path.Combine(Img1rootpath, Img1PathTxt);
                if (File.Exists(Img1filepath))
                {
                    MessageDialog m1 = new MessageDialog("OK");
                    await m1.ShowAsync();
                    StorageFolder getimg1 = ApplicationData.Current.LocalFolder;
                    StorageFile fileimg1 = await getimg1.GetFileAsync(Img1PathTxt);
                    string imageName = await FileIO.ReadTextAsync(fileimg1);
                    StorageFile ImgFile = await KnownFolders.PicturesLibrary.GetFileAsync(imageName);
                    using (IRandomAccessStream imgstream = await ImgFile.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage b1 = new BitmapImage();
                        await b1.SetSourceAsync(imgstream);
                        Img1.Source = b1;
                    }
    
                }
            }
    
            private async void Lapage_Loaded(object sender, RoutedEventArgs e)
            {
              await CheckImgExists();
            }
        }
    }
    

    La démarche consiste à utiliser le répertoire KnownFolders.PicturesLibrary étant donné que d'après votre scénario seules les images qui se situent dans le répertoire Images seront exploitées.

    N'oubliez surtout pas d'activer la Capabilité PicturesLibrary dans le package manifest. Voir image ci-dessous

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    jeudi 27 avril 2017 22:42

Toutes les réponses

  • Bonjour Jean-François,

    Malheureusement je n'ai pas de dispo pour tester le code, en revanche essayez de remplacer la méthode CheckImgExists() : 

     StorageFile fileimg1 = await getimg1.GetFileAsync("Img1Path.txt");

    Par : 

    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Img1Path.txt"));
    Pour plus d'informations sur l'accès aux fichier dans une application UWP, vous avez ce lien : https://docs.microsoft.com/fr-fr/windows/uwp/files/file-access-permissions

    N'hésitez pas à me le dire si cela ne fonctionne pas. Je pourrais tester le code qu'en début de soirée.

    Si cela ne fonctionne pas, essayez ceci : 

    StorageFolder getimg1 = ApplicationData.Current.LocalFolder; StorageFile fileimg1 = await getimg1.GetFileAsync("Img1Path.txt"); var readFile = await Windows.Storage.FileIO.ReadLinesAsync(fileimg1); foreach (var line in readFile) { BitmapImage b1=new BitmapImage(); await b1.SetSourceAsync(new Uri(line)); Img1.Source=b1; }

    PS : N'oubliez pas lors de l'utilisation du filepicker d'utiliser ceci (code à adapter) :

    StorageFile file = await filePicker.PickSingleFileAsync();
    string token = StorageApplicationPermissions.FutureAccessList.Add(file, “metadata”);

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;



    jeudi 27 avril 2017 11:31
  • Bonjour Nordine et encore merci pour ces codes.

    Pour le 1er code j'obtient cette erreur :

    Pour le 2eme j'obtient cette erreur :


    JF Collombet ® CreateSpecificCulture

    jeudi 27 avril 2017 12:10
  • Bonsoir Jean-François,

    Voici le code testé et qui fonctionne chez moi : 

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using System.Threading.Tasks;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.Storage;
    using Windows.Storage.AccessCache;
    using Windows.Storage.Pickers;
    using Windows.Storage.Streams;
    using Windows.UI.Popups;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Media.Imaging;
    using Windows.UI.Xaml.Navigation;
    
    // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
    
    namespace App3
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            String Img1PathTxt = "Img1Path.txt";
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private async void LoadImgBtn_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var PickImg1 = new FileOpenPicker()
                {
                    ViewMode = PickerViewMode.List,
                    SuggestedStartLocation = PickerLocationId.PicturesLibrary
                };
                PickImg1.FileTypeFilter.Add(".png");
                PickImg1.FileTypeFilter.Add(".jpeg");
                StorageFile file = await PickImg1.PickSingleFileAsync();
                if (file != null)
                {
                    using (IRandomAccessStream filestream = await file.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage bitmap1 = new BitmapImage();
                        await bitmap1.SetSourceAsync(filestream);
                        Img1.Source = bitmap1;
                        StorageFolder Img1path = ApplicationData.Current.LocalFolder;
                        StorageFile img = await Img1path.CreateFileAsync(Img1PathTxt, CreationCollisionOption.ReplaceExisting);
                        StorageFile imgfile = await Img1path.GetFileAsync(Img1PathTxt); // C:\Users\collo\Pictures\TestImg1.PNG
                        await FileIO.WriteTextAsync(imgfile, file.Name);
                        Debug.WriteLine(file.Path);
                    }
                }
            }
    
            private async Task CheckImgExists()
            {
                string Img1rootpath = ApplicationData.Current.LocalFolder.Path;
                string Img1filepath = Path.Combine(Img1rootpath, Img1PathTxt);
                if (File.Exists(Img1filepath))
                {
                    MessageDialog m1 = new MessageDialog("OK");
                    await m1.ShowAsync();
                    StorageFolder getimg1 = ApplicationData.Current.LocalFolder;
                    StorageFile fileimg1 = await getimg1.GetFileAsync(Img1PathTxt);
                    string imageName = await FileIO.ReadTextAsync(fileimg1);
                    StorageFile ImgFile = await KnownFolders.PicturesLibrary.GetFileAsync(imageName);
                    using (IRandomAccessStream imgstream = await ImgFile.OpenAsync(FileAccessMode.Read))
                    {
                        BitmapImage b1 = new BitmapImage();
                        await b1.SetSourceAsync(imgstream);
                        Img1.Source = b1;
                    }
    
                }
            }
    
            private async void Lapage_Loaded(object sender, RoutedEventArgs e)
            {
              await CheckImgExists();
            }
        }
    }
    

    La démarche consiste à utiliser le répertoire KnownFolders.PicturesLibrary étant donné que d'après votre scénario seules les images qui se situent dans le répertoire Images seront exploitées.

    N'oubliez surtout pas d'activer la Capabilité PicturesLibrary dans le package manifest. Voir image ci-dessous

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    jeudi 27 avril 2017 22:42
  • Un grand merci Nordine c'est parfait !!

    JF Collombet ® CreateSpecificCulture

    vendredi 28 avril 2017 03:04