Implémentation du contrôle + Helper
Controle conteneur
public class NavigationContent : UserControl
{
public NavigationContent(UserControl initialWindow)
: this(initialWindow, 800, 600)
{ }
public NavigationContent(UserControl initialWindow, int width, int height)
{
this.Height = height;
this.Width = width;
this.NavigateTo(initialWindow);
}
public void NavigateTo(UserControl element)
{
NavigateTo(element, null);
}
public void NavigateTo(UserControl element, object context)
{
if (null != context)
element.DataContext = context;
this.Content = element;
}
}
Exception qui sera lancée si on ne retrouve pas de VisualRoot principal dans l'application
public class VisualRootNotFoundException : Exception
{
public VisualRootNotFoundException(string message)
: base(message) { }
}
Petit helper de naviguation
public class NavigationHelper
{
public static void NavigateTo(UserControl element, object context)
{
NavigationContent content = (NavigationContent)Application.Current.RootVisual;
if (null == content)
throw new VisualRootNotFoundException("The root visual can't be found");
if (null != context)
element.DataContext = context;
content.NavigateTo(element);
}
public static void NavigateTo(UserControl element)
{
NavigateTo(element, null);
}
}
Petite démonstration
Voici comment utiliser ce petit contrôle conteneur. La première chose à faire est de placer le conteneur de UserControl dans le VisualRoot principal qui se lance lors du chargement de l'application Silverlight dans la méthode Application_Startup. On utilise la classe. C'est le seul endroit où on utilise la classe du conteneur.
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
Page2 page = new Page2();
page.DataContext = new UserInfo();
this.RootVisual = new NavigationContent(page, 1900, 1200);
}
}
Voici un petit exemple de classe qui supporte le databinding. Cette classe sera utilisée dans le contexte des pages. Le but de cette démo et de passer d'un écran à l'autre en passant les données encodées dans une textbox.
public class UserInfo : INotifyPropertyChanged
{
public string Nom
{
get { return nom; }
set
{
if (value != nom)
{
nom = value;
Change("Nom");
}
}
}
private string nom;
#region INotifyPropertyChanged Members
private void Change(string propertyName)
{
if(null != PropertyChanged)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
Partie XAML du UserControl qui sera lancé au debut et qui sert de formulaire pour encoder une valeur dans la propriété Nom.
<UserControl x:Class="SilverlightApplication1.Page2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800" Height="600">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="10*"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Name="nom" Text="{Binding Nom, Mode=TwoWay}"/>
<Button Grid.Row="1" Content="Coucou !" Click="Button_Click"></Button>
</Grid>
</UserControl>
Partie C# du UserControl. Il est intéressant de regarder la partie liée au Click du bouton. C'est à ce moment la que l'on utilise le Helper qui changera de "View" en passant le DataContext qui contient l'objet avec la propriété Nom mise à jour.
public partial class Page2 : UserControl
{
public Page2()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
NavigationHelper.NavigateTo(new Page3(), this.DataContext);
}
}
Résultat visuel !
Formulaire:Résultat: