Volviendo a la integración, la opción del artículo anterior tiene un problema de escalabilidad. Si tuviésemos 500 pantallas, ¿implica que deberíamos tener un manejador y una clase principal con 500 atributos privados que iremos instanciando? Entonces, si aplicamos la idea anterior y la resolvemos de un modo un poco más elegante la solución será que cada botón u acción de cambio de estado sea el responsable de internamente notificar a la aplicación cuál es ese estado para que instancie correctamente el objeto adecuado. Para ello, vamos a usar la propiedad DataContext que tiene la clase Button como sigue:
1: <Button x:Name="buttonArticle" Content="Articles" Click="buttonArticle_Click" BorderBrush="#FF7100FF" Cursor="Hand" ClickMode="Press">
2: <Button.DataContext>
3: <local:Article/>
4: </Button.DataContext>
5: </Button>
6: <Button x:Name="buttonAbout" Content="About" Click="buttonAbout_Click" BorderBrush="#FF7100FF" Cursor="Hand" ClickMode="Press">
7: <Button.DataContext>
8: <local:About/>
9: </Button.DataContext>
10: </Button>
Estamos rellenando la propiedad DataContext con el nombre del UserControl que vamos a instanciar. Cuando hagamos click en cada botón, usaremos el Assembly para instanciarlo. Con esto nos ahorramos tener que declarar y gestionar los atributos o variables necesarias para instanciar manualmente cada una de las clases. Por ejemplo, cuando haga click en el botón de About ocurriá lo siguiente:
1: private void buttonAbout_Click(object sender, System.Windows.RoutedEventArgs e)
2: {
3: this.renderOnCanvas((Button)sender).DataContext);
4: }
Y el método renderOnCanvas será el encargado de obtener la clase adecuada cuyo nombre hemos asignado dentro del DataContext e instanciarla:
1: private void renderOnCanvas(string controlName)
2: {
3: Type type = this.GetType();
4: Assembly assembly = type.Assembly;
5: UserControl newPage = (UserControl)assembly.CreateInstance(type.Namespace + "." + controlName);
6: canvas.Children.Clear();
7: canvas.Children.Add(newPage);
8: }
De este modo evitamos el añadir manualmente los atributos o variables de cada instancia y podemos automatizarlo, además de traspasar la responsabilidad de cada sección al botón correspondiente.
No hay comentarios:
Publicar un comentario