2009-08-16 5 views
1

J'essaie de créer une application Silverlight où j'utilise 5 XAMLS. Le premier, "Page.xaml" contient un menu avec 4 boutons et un Canvas pour recevoir le XAML de chaque contenu. Chaque contenu XAML possède 2 storyboards: "entrada" (l'animation "enter section") et "saida" (l'animation de fin de section).Acquisition de Storyboards à partir d'un autre XAMLS

Je rencontre le problème suivant: Le menu se trouve dans Page.xaml. Je veux que chaque bouton, quand on clique, commence le storyboard "saida", et, quand le storyboard finit de jouer, il charge le nouveau contenu d'un autre XAML (choisi par le menu). Lorsque j'essaie de le faire, Visual Studio ne cesse de me dire que "ContentCanvas" n'existe pas dans le contexte actuel "pour chaque contenu XAML.

Voici mes Page.xaml.cs:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace SilverlightPagingSystemProject 
{ 
    public partial class Page : UserControl 
    { 
     String secao = "home"; 
     Section1 s1 = new Section1(); 
     Section2 s2 = new Section2(); 
     Section3 s3 = new Section3(); 

     public Page() 
     { 
      // Required to initialize variables 
      InitializeComponent(); 
      Link1.MouseLeftButtonDown += new MouseButtonEventHandler(Link1_MouseLeftButtonDown); 
      Link2.MouseLeftButtonDown += new MouseButtonEventHandler(Link2_MouseLeftButtonDown); 
      Link3.MouseLeftButtonDown += new MouseButtonEventHandler(Link3_MouseLeftButtonDown); 
     } 

     private void Link1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      if (secao == "home") 
      { 
       ContentCanvas.Children.Remove(s1); 
       ContentCanvas.Children.Remove(s2); 
       ContentCanvas.Children.Remove(s3); 
       ContentCanvas.Children.Add(s1); 
      } 
      else 
      { 
       ContentCanvas.saida.Begin(); 
      } 
     } 

     private void Link2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      if (secao == "home") 
      { 
       ContentCanvas.Children.Remove(s1); 
       ContentCanvas.Children.Remove(s2); 
       ContentCanvas.Children.Remove(s3); 
       ContentCanvas.Children.Add(s2); 
      } 
      else 
      { 
       ContentCanvas.saida.Begin(); 
      } 
     } 

     private void Link3_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      if (secao == "home") 
      { 
       ContentCanvas.Children.Remove(s1); 
       ContentCanvas.Children.Remove(s2); 
       ContentCanvas.Children.Remove(s3); 
       ContentCanvas.Children.Add(s3); 
      } 
      else 
      { 
       ContentCanvas.saida.Begin(); 
      } 
     } 
    } 
} 

Et voici ma sections XAML. Tous sont les mêmes.

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace SilverlightPagingSystemProject 
{ 
    public partial class Section3 : UserControl 
    { 
     public Section3() 
     { 
      // Required to initialize variables 
      InitializeComponent(); 
      Section3LayoutRoot.Loaded += new RoutedEventHandler(Section1LayoutRoot_Loaded); 
      saida.Completed += new EventHandler(saida_Completed); 
     } 

     void saida_Completed(object sender, EventArgs e) 
     { 
      this.Parent.ContentCanvas.Children.Remove(s1); 
      this.Parent.ContentCanvas.Children.Remove(s2); 
      this.Parent.ContentCanvas.Children.Remove(s3); 
      this.Parent.ContentCanvas.Children.Add(secao); 
     } 

     void Section1LayoutRoot_Loaded(object sender, RoutedEventArgs e) 
     { 
      entrada.Begin(); 
     } 
    } 
} 

Merci pour l'aide!

Répondre

1

Si je ne me trompe pas, l'objet obtenu via la référence this.Parent devrait en fait être l'objet ContentCanvas. Alors essayez de changer

this.Parent.ContentCanvas.Children.Remove(s1); 

à

((Canvas)this.Parent).Children.Remove(s1); 

supposant ContentCanvas est en fait une toile.

+0

Ceci a partiellement résolu le problème. Maintenant, le problème semble être qu'il ne peut pas trouver "s1", "s2" ... et ainsi de suite, car ils sont sur le principal XAML. Mais bonne aide de toute façon! –

+0

Oui, vous aurez certainement besoin d'une référence à ces objets pour pouvoir les supprimer de cette façon. Si vous n'avez pas cette référence (ce n'est pas une solution particulièrement intéressante mais qui fonctionnera) vous pouvez juste définir la propriété Name de s1, s2, s3 quand ils sont créés et ensuite parcourir la collection Children vérifier les noms de chacun obtenir les références dont vous avez besoin. Ou si ces 3 sections sont les seuls enfants de ContentCanvas, utilisez simplement ((Canvas) this.Parent) .Children.Remove (((Canvas) this.Parent) .Enfants [0]) ((Canvas) this.Parent). Enfants.Retirer (((Canvas) this.Parent) .Enfants [1]) etc. –

+0

Cela résoudra le problème de l'enlèvement des enfants. C'était bien! Mais j'ai encore besoin de contrôler le Storyboard de l'enfant en utilisant le XAML principal. Comment puis-je y parvenir? Merci pour votre aide! –

Questions connexes