Navegación tipo web

 

Aps. WPF estándar

Aps. XBAP

Aps. Silverlight

Son instaladas en la máquina del usuario final. No son instaladas en la máquina del usuario. La máquina del usuario final NO necesita .NET Framework
Pueden instalarse vía MSI o ClickOnce. Pueden ser desplegadas vía ClickOnce. Pueden ejecutarse en cualquier navegador y plataforma.
No pueden instalarse de forma automática nuevas versiones. Pueden instalarse de forma automática nuevas versiones. Sólo requieren una descarga de un complemento que se instala en pocos segundos.
Aparecen en el menú de inicio y en agregar o quitar programas. No aparecen en el menú de incio ni en agregar o quitar programas.
Se ejecutan en su propia ventana Sólo pueden ejecutarse en IE y Firefox Se pueden configurar para que se ejecuten fuera del explorador
S.O. Windows S.O. Windows Multiplataforma
Se usan como aplicaciones de escritorio Se usan como aplicaciones para INTRANET Se usan como aplicaciones para INTERNET
No se necesita una conexión a Internet Se necesita una conexión a Internet o Intranet Se necesita una conexión a Internet
Pueden utilizar WCF NO pueden utilizar WCF Pueden utilizar WCF

Navegación

WPF admite la navegación de tipo web con páginas (class Page) e hipervínculos (clase Hyperlink).

Se puede implementar mediante:

  • Páginas compiladas en una aplicación independiente y hospedadas en una ventana de navegación (NavigationWindow).
  • Páginas hospedadas por un marco (clase Frame) hospedado en una página que puede ser independiente o bien compilada en una aplicación XBAP o en una aplicación independiente.
  • Páginas independientes que se hospedan en un explorador web
  • Páginas compiladas en una aplicación XBAP que se hospedan en un explorador web: IE o Firefox.

Para facilitar la navegación, WPF implementa la clase NavigationService, que es el motor de navegación compartido para procesar las solicitudes de navegación Frame, NavigationWindow y XBAP. Esta clase proporciona métodos de navegación para iniciar la navegación, eventos de navegación para interactuar con ella y un historial de navegación, un diario (Journal), para memorizar la navegación hacia delante y hacia atrás. Es decir, NavigationService encapsula la funcionalidad que permite descargar el contenido dentro del contexto de una navegación de explorador, este contenido puede ser cualquier objeto .NET y fichero HTML. No obstante, la manera preferido para empaquetar el contenido para la navegación son las páginas (Page).

Veamos una aplicaicón dond ese permite ver los datos de una persona seleccionada de una lista. La aplicación constará de varias páginas WPF hospedadas en una ventana con el estilo del explorador.

Creación base de datos XML.

Proveedor: xml-Telefonos
Fuente de datos: telefonos.xml

<?xml version="1.0" encoding="utf-8"?>
<listatelefonos>
  <persona>
    <foto>Imagenes/foto.jpg</foto>
    <nombre>Persona 01</nombre>
    <direccion>Direccion 01</direccion>
    <telefono>Telefono 01</telefono>
    <es_movil>True</es_movil>
  </persona>
  <persona>
    <foto>Imagenes/foto.jpg</foto>
    <nombre>Persona 02</nombre>
    <direccion>Direccion 02</direccion>
    <telefono>Telefono 02</telefono>
    <es_movil>False</es_movil>
  </persona>
  <persona>
    <foto>Imagenes/foto.jpg</foto>
    <nombre>Persona 03</nombre>
    <direccion>Direccion 03</direccion>
    <telefono>Telefono 03</telefono>
    <es_movil>False</es_movil>
  </persona>
</listatelefonos>

App.xml

<Application x:Class="Telefonos.App"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 StartupUri="MainWindow.xaml">
   <Application.Resources>
     <XmlDataProvider x:Key="xmlTelefonos"
 Source="Datos/telefonos.xml"
 XPath="listatelefonos/persona" />
   </Application.Resources>
</Application>

MainWindow.xml

<NavigationWindow x:Class="Telefonos.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Title="MainWindow" Height="350" Width="525"
 Source="PagListado.xaml">

</NavigationWindow>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
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.Navigation;
using System.Windows.Shapes;

namespace Telefonos
{
    ///
    /// Lógica de interacción para MainWindow.xaml
    /// 
public partial class MainWindow : NavigationWindow   
  {   
    public MainWindow() 
    { 
      InitializeComponent(); 
    } 
  } 
}

Page1

<Page x:Class="Telefonos.Page1"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
 mc:Ignorable="d" 
 d:DesignHeight="300" d:DesignWidth="300"
 Title="Listado Personas">
<Grid>
 <Label Content="Datos personales" HorizontalAlignment="Left" Height="30" Margin="10,10,0,0" VerticalAlignment="Top" Width="161" FontSize="16" FontWeight="Bold"/>
 <ListBox x:Name="lstPersonas" HorizontalAlignment="Left" Height="177" Margin="36,66,0,0" VerticalAlignment="Top" Width="179"
 ItemsSource="{Binding Source={StaticResource xmlTelefonos}}">
 <ListBox.ItemTemplate>
 <DataTemplate>
 <StackPanel>
 <TextBlock Text="{Binding XPath=nombre}" />
 </StackPanel>
 </DataTemplate>
 </ListBox.ItemTemplate>
 </ListBox>
 <Button x:Name="btnMostrar" Content="Mostar" HorizontalAlignment="Left" Margin="140,260,0,0" VerticalAlignment="Top" Width="75" Click="btnMostrar_Click"/>
</Grid>
</Page>

PagListado.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
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.Navigation;
using System.Windows.Shapes;

namespace Telefonos
{
    /// 
    /// Lógica de interacción para Page1.xaml
    /// 
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void btnMostrar_Click(object sender, RoutedEventArgs e)
        {
            PagDatos pagDatos = new PagDatos(this.lstPersonas.SelectedItem);
            this.NavigationService.Navigate(pagDatos);
        }
    }
}

Hyperlinks

Este objeto implementa la propiedad NavigateUri que especifica el URI del contenidoal que se desea navegar al hacer clic en ese hipervínculo. Esta forma de navegación sólo es valida si el elemento del Hyperlink es un host de navegación (NavigationWindow, Frame o un explorador).

Controlar la navegación capturando las excepciones.

private void Application_NavigationFailed (object sender, System.Windows.NavigationFailedEventArgs e) {
  if (e.Exception is exception) {
    MessageBox.Show("el URI " + e.Uri.ToString()+" no está disponible.");
    e.Handled = true;
  }
}

Frame

Da la posibilidad de colocar una página dentro de una ventana o de otra página. Frame es un control de contenido que soporta navegación. El contenido pude ser html o xaml, aunque la lo mejor es utilizar el objeto Page.

Una propiedad del Frame  es JournalOwnership, que permite especificar si Frame administra su propio historial de navegación o cede la administración del mismo a un navegador primario (NavigationWindow o Frame).

Recepción de parámetros.

Definiendo propiedades que soporten los datos a pasar.

public object Persona {get; set;}

 

private void btMostrar_Click (object sender, RoutedEventArgs e) {
  PagDatos pagDatos = new PagDatos();
  pagDatos.Persona = this.lstPersonas.SelectedItem;
  this.NavigationService.Navigate(pagDatos);
}

 

private void Page_Loaded (object sender, RoutedEventArgs e) {
  this DataContext = Persona;
}

Otra forma, menos laboriosa, el constructor con parámetros incoca al constructor sin parámetros :

using System.Collections.Generic;
using System.Linq;
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.Navigation;
using System.Windows.Shapes;

namespace Telefonos
{
    /// 
    /// Lógica de interacción para PagDatos.xaml
    /// 
    public partial class PagDatos : Page
    {
        public PagDatos()
        {
            InitializeComponent();
        }
        public PagDatos (object persona): this()
        {
            this.DataContext = persona;
        }
    }
}

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.