locked
Relancer la construction de la page d'accueil possible ? RRS feed

  • Question

  • Bonjour,

    Je développe : j'utilise un Panorama que je peux modifier à partir d'une page de paramètres. Or pour l'instant je suis obligé de relancer l'application pour que cela prenne effet.

    Je voudrais donc savoir s'il est possible de relancer le InitializeComponent() de la page d'accueil (ou tout simplement la construction du Panorama d'accueil), une fois les paramètres enregistrés, ou au retour en arrière.

    Merci d'avance

    mardi 26 juillet 2011 13:23

Réponses

  • Alors une première solution serait de bouger cela dans le OnLoaded

     

    // dans constructeur
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    
      
    
     void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
        //ton code
        }
    

     

     

    Une autre solution serait d'utiliser les Binding (et je t'encourage vivement à regarder ca de près :

     

    La classe Param qui represente tes settings

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.ComponentModel;
    
    namespace WindowsPhoneApplication7
    {
    	public class Param:INotifyPropertyChanged
      {
        #region Singleton
        public static Param GetInstance()
    		{
    		if(Instance==null)
    			Instance=new Param();
    			return Instance;
    		}
    		
    		static private Param Instance;
        #endregion
    
    
        public Param()
    		{
    		SelectedImage="/Image/A.jpg";	
    			
    		}
    
        #region SelectedImage
        private String selectedImage;
    		public String SelectedImage
    		{
    			get
    			{
    				return selectedImage;	
    			}
    			set
    			{
    				selectedImage=value;
    				RaisePropertyChanged("SelectedImage");
    			}
    		}
        #endregion
    
    
        #region Notification
        internal virtual void RaisePropertyChanged(string propertyName)
        {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
            handler(this, new PropertyChangedEventArgs(propertyName));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
      }
    }
    

     

     

    Le XAML de ta page

    <controls:Panorama >
    		<controls:Panorama.Title>
    			 <Image Source="{Binding SelectedImage}" Height="100"/>
    		</controls:Panorama.Title>
    		
    		<controls:PanoramaItem Header="item1">
    			<Grid>
    				<ListBox x:Name="ListImage" Margin="46,49,50,218" SelectionChanged="ListImage_SelectionChanged"/>
    			</Grid>
    		</controls:PanoramaItem>
    		<controls:PanoramaItem Header="item2">
    			<Grid/>
    		</controls:PanoramaItem>
    	</controls:Panorama>
    


    le code CS qui va avec :

     public partial class MainPage : PhoneApplicationPage
      {
        public MainPage()
        {
    			this.DataContext=Param.GetInstance();
    	    InitializeComponent();
       		this.ListImage.ItemsSource=new String[]{"Image/A.jpg","Image/B.jpg","Image/C.jpg"};
        }
    
       
        private void ListImage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
    			if(e.AddedItems.Count==0)
    				return;
    			
        Param.GetInstance().SelectedImage=(String)e.AddedItems[0];
    			
    		}
      }
    
    

    J'ai tout mis dans la même page pour une meilleure comprehension, mais si tu mets la listbox ailleurs, ca fonctionne toujours :)

     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 15:08
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:20
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 15:08
  •  

    Inspire toi de cette partie du code pour l'adapté à ta classe parametres

     

     

      #region SelectedImage
      private String selectedImage;
    		public String SelectedImage
    		{
    			get
    			{
    				return selectedImage;	
    			}
    			set
    			{
    				selectedImage=value;
    				RaisePropertyChanged("SelectedImage");
    			}
    		}
      #endregion
    
    
      #region Notification
      internal virtual void RaisePropertyChanged(string propertyName)
      {
       PropertyChangedEventHandler handler = PropertyChanged;
       if (handler != null)
       {
        handler(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      #endregion
    
    


    Le secret est le RaisePropertyChanged, ca indique à tes bindings que les valeurs ont changés ! (fait hériter ta classe de : NotifyPropertyChanged)


     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 17:14
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:19
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 17:14
  • Comme je suis généreux aujourd'hui :

     

    	public class Parametres:INotifyPropertyChanged
     {
     
    
      
      #region PanoLogoSource
      private String panoLogoSource;
    		public String PanoLogoSource
    		{
    			get
    			{
    				return panoLogoSource;	
    			}
    			set
    			{
    				panoLogoSource=value;
    				RaisePropertyChanged("PanoLogoSource");
    			}
    		}
      #endregion
    
    
      #region PanoLogoLeft
      private int panoLogoLeft;
    		public int PanoLogoLeft
    		{
    			get
    			{
    				return panoLogoLeft;	
    			}
    			set
    			{
    				panoLogoLeft=value;
    				RaisePropertyChanged("PanoLogoLeft");
    			}
    		}
      #endregion
    
    
      #region PanoLogoTop
      private int panoLogoTop;
    		public int PanoLogoTop
    		{
    			get
    			{
    				return panoLogoTop;	
    			}
    			set
    			{
    				panoLogoTop=value;
    				RaisePropertyChanged("PanoLogoTop");
    			}
    		}
      #endregion
    
    
      #region Notification
      internal virtual void RaisePropertyChanged(string propertyName)
      {
       PropertyChangedEventHandler handler = PropertyChanged;
       if (handler != null)
       {
        handler(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      #endregion
     }
    }
     
    
    



    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 17:17
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:19
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 17:17
  • Ok, a mon avis, tu as créé deux objets Parameters pour chaque page, donc forcement, quand tu changes la valeur d'une propriété d'un des objets, ca n'a pas de répercussion sur l'autre

     

    Crée ton objet

         <local:ClasseParametres x:Key="parametres"></local:ClasseParametres>

     

    dans App.xaml une seule fois et non dans chaque page.

     

    Voila !

     

     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mercredi 27 juillet 2011 10:24
  • var param=Application.Current.Resources["parametres"] as ClassParametres;

     

    Voila


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:57
    mercredi 27 juillet 2011 11:52

Toutes les réponses

  • Y'a une réponse toute trouvé à ton problème : le Binding !

     

    Donne nous un exemple simple de ton panorama et de ce que tu souhaites modifier dedans ;)


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mardi 26 juillet 2011 14:19
  • En fait l'image du "Title" du Panorama dépend d'un paramètre dont on en a le choix dans la page "Parametres.xaml".

    Voici l'état actuel de la fonction appelée quand le ListPicker change d'état :

        private void QuelLogo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          parametres.QuelLogo = QuelLogo.SelectedIndex;
          
          MessageBox.Show("Les changements prendront effet au prochain démarrage de l'application.", "Paramètre modifié", MessageBoxButton.OK);
        }
    


     

    mardi 26 juillet 2011 14:40
  • ok je te fais un exemple de suite
    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mardi 26 juillet 2011 14:41
  • Ah oui j'oubliais, je lance ça aussi après le InitializeComponent() :

     

       Uri imageUri;
    
       if (RecupValeur<int>(QuelLogoKeyName, QuelLogoDefaut) == 0)
       {
        imageUri = new Uri("/Images/logo_court.png", UriKind.RelativeOrAbsolute);
        Canvas.SetTop(imagelogo, 60);
        Canvas.SetLeft(imagelogo, 30);
       }
       else
       {
        imageUri = new Uri("/Images/logo_long.png", UriKind.RelativeOrAbsolute);
        Canvas.SetTop(imagelogo, 75);
        Canvas.SetLeft(imagelogo, -10);
       }
    
       // Application et affichage de l'image
    
       BitmapImage bitmapImage = new BitmapImage(imageUri);
       imagelogo.Source = bitmapImage;
    


     


    mardi 26 juillet 2011 14:52
  • Alors une première solution serait de bouger cela dans le OnLoaded

     

    // dans constructeur
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    
      
    
     void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
        //ton code
        }
    

     

     

    Une autre solution serait d'utiliser les Binding (et je t'encourage vivement à regarder ca de près :

     

    La classe Param qui represente tes settings

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.ComponentModel;
    
    namespace WindowsPhoneApplication7
    {
    	public class Param:INotifyPropertyChanged
      {
        #region Singleton
        public static Param GetInstance()
    		{
    		if(Instance==null)
    			Instance=new Param();
    			return Instance;
    		}
    		
    		static private Param Instance;
        #endregion
    
    
        public Param()
    		{
    		SelectedImage="/Image/A.jpg";	
    			
    		}
    
        #region SelectedImage
        private String selectedImage;
    		public String SelectedImage
    		{
    			get
    			{
    				return selectedImage;	
    			}
    			set
    			{
    				selectedImage=value;
    				RaisePropertyChanged("SelectedImage");
    			}
    		}
        #endregion
    
    
        #region Notification
        internal virtual void RaisePropertyChanged(string propertyName)
        {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
            handler(this, new PropertyChangedEventArgs(propertyName));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
      }
    }
    

     

     

    Le XAML de ta page

    <controls:Panorama >
    		<controls:Panorama.Title>
    			 <Image Source="{Binding SelectedImage}" Height="100"/>
    		</controls:Panorama.Title>
    		
    		<controls:PanoramaItem Header="item1">
    			<Grid>
    				<ListBox x:Name="ListImage" Margin="46,49,50,218" SelectionChanged="ListImage_SelectionChanged"/>
    			</Grid>
    		</controls:PanoramaItem>
    		<controls:PanoramaItem Header="item2">
    			<Grid/>
    		</controls:PanoramaItem>
    	</controls:Panorama>
    


    le code CS qui va avec :

     public partial class MainPage : PhoneApplicationPage
      {
        public MainPage()
        {
    			this.DataContext=Param.GetInstance();
    	    InitializeComponent();
       		this.ListImage.ItemsSource=new String[]{"Image/A.jpg","Image/B.jpg","Image/C.jpg"};
        }
    
       
        private void ListImage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
    			if(e.AddedItems.Count==0)
    				return;
    			
        Param.GetInstance().SelectedImage=(String)e.AddedItems[0];
    			
    		}
      }
    
    

    J'ai tout mis dans la même page pour une meilleure comprehension, mais si tu mets la listbox ailleurs, ca fonctionne toujours :)

     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 15:08
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:20
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 15:08
  • Alors avant de regarder ta réponse j'avais tenté une modification : j'ai tout retiré du MainPage.xams.cs, j'ai modifié ma classe de paramètres pour y rajouter en readonly l'url, le canvasleft et canvasright qui sont automatiquement mis à jour dès que le ListPicker lance l'enregistrement de la nouvelle valeur de l'index sélectionné.

    Comme ça j'ai tout regroupé au sein de la classe de paramètres, déjà pour moi au niveau du code c'était plus clair.

    Et donc j'ai modifié mon xaml comme suit :

     

       <controls:Panorama.Title>
        <Canvas Name="canvaslogo">
         <Image Name="imagelogo"
           Source="{Binding Source={StaticResource parametres}, Path=PanoLogoSource, Mode=OneWay}"
           Canvas.Left="{Binding Source={StaticResource parametres}, Path=PanoLogoLeft, Mode=OneWay}"
           Canvas.Top="{Binding Source={StaticResource parametres}, Path=PanoLogoTop, Mode=OneWay}"/>
        </Canvas>
       </controls:Panorama.Title>
    

    Mais idem, toujours besoin de relancer l'appli
    mardi 26 juillet 2011 16:46
  •  

    Inspire toi de cette partie du code pour l'adapté à ta classe parametres

     

     

      #region SelectedImage
      private String selectedImage;
    		public String SelectedImage
    		{
    			get
    			{
    				return selectedImage;	
    			}
    			set
    			{
    				selectedImage=value;
    				RaisePropertyChanged("SelectedImage");
    			}
    		}
      #endregion
    
    
      #region Notification
      internal virtual void RaisePropertyChanged(string propertyName)
      {
       PropertyChangedEventHandler handler = PropertyChanged;
       if (handler != null)
       {
        handler(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      #endregion
    
    


    Le secret est le RaisePropertyChanged, ca indique à tes bindings que les valeurs ont changés ! (fait hériter ta classe de : NotifyPropertyChanged)


     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 17:14
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:19
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 17:14
  • Comme je suis généreux aujourd'hui :

     

    	public class Parametres:INotifyPropertyChanged
     {
     
    
      
      #region PanoLogoSource
      private String panoLogoSource;
    		public String PanoLogoSource
    		{
    			get
    			{
    				return panoLogoSource;	
    			}
    			set
    			{
    				panoLogoSource=value;
    				RaisePropertyChanged("PanoLogoSource");
    			}
    		}
      #endregion
    
    
      #region PanoLogoLeft
      private int panoLogoLeft;
    		public int PanoLogoLeft
    		{
    			get
    			{
    				return panoLogoLeft;	
    			}
    			set
    			{
    				panoLogoLeft=value;
    				RaisePropertyChanged("PanoLogoLeft");
    			}
    		}
      #endregion
    
    
      #region PanoLogoTop
      private int panoLogoTop;
    		public int PanoLogoTop
    		{
    			get
    			{
    				return panoLogoTop;	
    			}
    			set
    			{
    				panoLogoTop=value;
    				RaisePropertyChanged("PanoLogoTop");
    			}
    		}
      #endregion
    
    
      #region Notification
      internal virtual void RaisePropertyChanged(string propertyName)
      {
       PropertyChangedEventHandler handler = PropertyChanged;
       if (handler != null)
       {
        handler(this, new PropertyChangedEventArgs(propertyName));
       }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      #endregion
     }
    }
     
    
    



    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mardi 26 juillet 2011 17:17
    • Marqué comme réponse Neo33ASM mardi 26 juillet 2011 17:19
    • Non marqué comme réponse Neo33ASM mardi 26 juillet 2011 22:59
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mardi 26 juillet 2011 17:17
  •  

    Ouh là, j'ai essayé, sans succès :S

    Voici comment j'ai construit ma classe de paramètres :

    - j'ai les paramètres principaux : comme le choix du logo (index donc int)

    - puis les paramètres secondaires induits de celui-ci

    Quand le choix du logo est fait, voici ce qui se passe :

     

     public int QuelLogo
     {
      get
      {
      return RecupValeur<int>(QuelLogoKeyName, QuelLogoDefaut);
      }
      set
      {
      ChangerValeur(QuelLogoKeyName, value);
      LogoAttributsUpdate();
      Save();
      }
     }

     

    La fonction "LogoAttributsUpdate" :

     

     public void LogoAttributsUpdate()
     {
      if (RecupValeur<int>(QuelLogoKeyName, QuelLogoDefaut) == 0)
      {
      ChangerValeur(LogoSourceKeyName, "/Images/logo_court.png");
      ChangerValeur(LogoCanvasLeftKeyName, 30);
      ChangerValeur(LogoCanvasTopKeyName, 60);
      }
      else
      {
      ChangerValeur(LogoSourceKeyName, "/Images/logo_long.png");
      ChangerValeur(LogoCanvasLeftKeyName, -10);
      ChangerValeur(LogoCanvasTopKeyName, 75);
      }
    
      RaisePropertyChanged(LogoSourceKeyName);
      RaisePropertyChanged(LogoCanvasLeftKeyName);
      RaisePropertyChanged(LogoCanvasTopKeyName);
     }

    et donc on a accès en readonly à ces 3 paramètres :

     

      public string LogoSource
      {
       get
       {
        return RecupValeur<string>(LogoSourceKeyName, LogoSourceDefaut);
       }
      }
    
      public int LogoCanvasLeft {
       get
       {
        return RecupValeur<int>(LogoCanvasLeftKeyName, LogoCanvasLeftDefaut);
       }
      }
    
      public int LogoCanvasTop {
       get
       {
        return RecupValeur<int>(LogoCanvasTopKeyName, LogoCanvasTopDefaut);
       }
      }


    mardi 26 juillet 2011 21:14
  • (j'ai retiré les réponses pour les remettre plus tard, juste pour que le topic reste "en cours")
    mercredi 27 juillet 2011 09:28
  • je me disais aussi : tiens mon score à vachement diminué !

     

     

    Ton Code semble correct, tu appelles bien RaisePropertyChanged, donc les propriétés dans le panorama doivent se mettre à jour (ta classe parametres hérite bien de INotifyPropertyChanged ?)


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 27 juillet 2011 09:46
  • Oui pourtant :S

      public class ClasseParametres :INotifyPropertyChanged
      {
    

    mercredi 27 juillet 2011 10:05
  • Ok, a mon avis, tu as créé deux objets Parameters pour chaque page, donc forcement, quand tu changes la valeur d'une propriété d'un des objets, ca n'a pas de répercussion sur l'autre

     

    Crée ton objet

         <local:ClasseParametres x:Key="parametres"></local:ClasseParametres>

     

    dans App.xaml une seule fois et non dans chaque page.

     

    Voila !

     

     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:13
    mercredi 27 juillet 2011 10:24
  • Et comment faire que sur les pages en C#, il me dise pas "Error 1 The name 'parametres' does not exist in the current context" ?
    mercredi 27 juillet 2011 10:44
  • var param=Application.Current.Resources["parametres"] as ClassParametres;

     

    Voila


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Marqué comme réponse Neo33ASM mercredi 27 juillet 2011 12:57
    mercredi 27 juillet 2011 11:52
  •  

    J'comprends pas, j'ai viré toutes les autres déclarations de paramètres, remplacées sur les .cs par

    ClasseParametres param = Application.Current.Resources["parametres"] as ClasseParametres;

    Mais toujours pas de "rafraichissement" de la page au changement de paramètre :S

     

    EDIT : Mea culpa, il restait une dernière déclaration, tout fonctionne, mille merci


    mercredi 27 juillet 2011 12:49