Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Que es WPF?
Clase
<Rectangle />
System.Windows.Shapes.Rectangle
<Button />
System.Windows.Controls.Button
<ListBox />
System.Windows.Controls.ListBox
Espacios de nombres en
XAML
Espacios de nombres en
XAML
Espacios de nombres en
XAML
<Grid xmlns:ans=
http://schemas.microsoft.com/winfx/2006/xaml
/presentation>
<ans:Button Width=200 Height=100
Content=Click me! />
</Grid>
Sintaxis de subelementos
Todas
es lo mismo que:
<Rectangle>
<Rectangle.Width>100</Rectangle.Width>
<Rectangle.Height>100</Rectangle.Height>
<Rectangle.Fill>Yellow</Rectangle.Fill>
</Rectangle>
Extensiones de marcado
{StaticResource}
{Binding}
{TemplateBinding}
{RelativeSource}
{x:Null}
Sintxis:
<Element property={Extensin [Properties]} />
Recursos
Recursos
Recursos
Propiedades adjuntas
Sintxis XAML
<ParentClass>
<Element ParentClass.Property = Value />
</ParentClass>
Propiedades adjuntas
Contenedores
Contenedores visuales
Otros
Border
ScrollViewer
Canvas
Propiedades adjuntas
Left
Right
Top
Bottom
Ejemplo Canvas
Qu obtenemos?
StackPanel
Ejemplo StackPanel
Qu obtenemos?
Grid
Propiedades adjuntas:
Column
Row
ColumnSpan
RowSpan
Grid
Automtico
En funcin de su contenido
Proporcional(*)
Predeterminado
Ejemplo Grid
Vase el siguiente fragmento de cdigo
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="110"/>
<RowDefinition Height=Auto"/>
<RowDefinition Height=*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Height=110/>
<ColumnDefinition Height=Auto/>
<ColumnDefinition Height=*/>
</Grid.ColumnDefinitions>
<Rectangle Width="100" Height="100" Fill="Blue" Grid.Column="0"
<Rectangle Width="100" Height="100" Fill="Blue" Grid.Column="1"
Grid.Row="1"/>
<Rectangle Width="100" Height="100" Fill="Blue" Grid.Column="2"
Grid.Row="2"/>
</Grid>
Grid.Row="0"/>
Qu obtenemos?
Propiedades de
distribucin
HorizontalAlignment y VerticalAlignment
Margin
MaxWidth
MaxHeight
MinWidth
MinHeight
Clase Shape
System.Windows.Shapes
Propiedades
Fill
Stroke
StrokeThickness
StrokeDashCap
StrokeDashOffset
Formas bsicas
System.Windows.Shapes
Ellipse
Rectangle
Line
Polyline
Polygon
Path
Image
System.Windows.Controls
Clase para representar una imagen
Similar al elemento <img> de HTML
Puede tener una fuente absoluta o relativa
Soporta solo imgenes png y jpg
<Image Source=someImg.png/>
<Image
Source=http://www.somepage.com/someImg.jpg />
TextBlock
System.Windows.Controls
Elemento principal para mostrar texto en
las aplicaciones XAML
Soporta cambiar el tamao de la fuente, el
tipo, las decoraciones, alineaciones, etc
Run
LineBreak
Salto de lnea explcito
Ejemplo
<TextBlock FontSize="50"
TextWrapping="Wrap">
<Run Foreground="Blue">Taller</Run>
de desarrollo de aplicaciones
<LineBreak />
con
<Run Foreground="Gold">WPF</Run>
<LineBreak />
<Run Foreground="Red">Semana ISW</Run>
</TextBlock>
Qu se obtiene?
Enlace de datos
Enlace de datos
Enlace de datos
Modelo robusto
Objeto fuente
Propiedad en el objeto fuente
Control destino
Propiedad en el control destino
Enlace de datos
Path
Indica una ruta a la propiedad en el objeto fuente
Parmetro predeterminado
Mode
Indica el modo para el enlace
Modos de enlace
OneTime
El enlace se establece y el objeto fuente y el
control destino no se vuelven a comunicar entre s
OneWay
El enlace se establece y cuaquier cambio que
suceda en el objeto fuente le avisar al control
destino
TwoWay
El enlace se establece y cuaquier cambio que
suceda en el objeto fuente le avisar al control
destino y viceversa (bi-direccional)
Modos de enlace
Interfaces
Interfaces
Interfaces
ObservableCollection<T>
Coleccin genrica recomendada para
escenarios de enlace de datos
Implementa INotifyPropertyChanged y
INotifyCollectionChanged
Automticamente actualiza el control de
lista que est enlazada
Disponible en
System.Collections.ObjectModel
ObservableCollection<User>
Plantillas de datos
Expresan el XAML que representa a cada
uno de los elementos en un control, lo
podemos usar en listas, botones, etc
Se expresan con el elemento
DataTemplate o ControlTemplate
Se declaran en linea junto con el elemento
a personalizar, o dentro del diccionario de
recursos de la pagina o aplicacin
Plantillas de datos
<Button >
<Button.Template>
<ControlTemplate>
<StackPanel
Orientation="Horizontal">
<Image Source="BB.jpg" />
<StackPanel>
<TextBlock Text="Click me"/>
<TextBlock Text="Right now!"/>
</StackPanel>
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>
Convertidores de valor
Clases que implementan la interfaz
IValueConverter
La interfaz IValueConverter incluye dos
mtodos a implementar:
Convert
Mtodo que se ejecuta cuando el valor fluye del
objeto fuente hacia el control destino
ConvertBack
Mtodo que se ejecuta cuando el valor fluye de
regreso: del control destino hacia el objeto fuente
Comandos
Son funcionalidad enlazable
Clases que implementan la interfaz
ICommand
Soportados por la familia de clases
ButtonBase
Miembros:
Model-ViewViewModel
Qu es MVVM?
Ventajas
Data binding
of commands
Data binding
of properties
ViewModel
Exposes Model to View for data binding
Exposes logic to user via data bound ICommands
Application-specific state and logic
Direct access
via code
Model
Domain specific entities and operations
Contains no knowledge of specific usage
MVVM
View
Define la interfaz de usuario
Define la estructura y apariencia de lo que el
usuario ve en la pantalla
Estilos, recursos
El contexto de datos es el ViewModel
Poco o nada de code-behind
Solo cdigo que no necesite pruebas unitarias
Comportamientos
Actualizada a travs de Bindings
MVVM
ViewModel
MVVM
Model
Tu dominio
Objetos de datos
DTO, POCO
Modelo de datos generado
Modelo de proxy generado
Capa de servicios
Repositorios
Objetos negocio
MVVM
Cardinalidad
Generalmente, una vista solo tiene un ViewModel
Un ViewModel puede ser usado en una o ms
vistas
Un Model puede ser usado en uno o mas
ViewModels
MVVM
MVVM
MVVM
Arquitectura de tu aplicacin
MVVM
Si recapitulamos
La vista es XAML
La vista puede tener code-behind
Solo el cdigo relacionado con la UI
Model
Crea una clase pblica llamada New con las
siguientes propiedades
Model
Crea una clase pblica llamada NewsEventArgs
que herede de la clase base EventArgs.
Este evento debe de guardar una lista de noticias,
resultado de un consumo de datos de una API de
noticias
Model
Crea una clase llamada NewsService y agrega un
manejador de eventos para NewsEventArgs
Model
Crea una funcion llamada GetNews que reciba una cadena como
parmetro.
Usaremos la clase XDocument para procesar la respuesta en formato
XML por medio de un query
ViewModel
Crea una clase llamada ActionCommand que
implemente las funciones de ICommand.
Crea una propiedad a nivel de clase del tipo
Action y que sea recibida por medio del
constructor.
La funcin CanExecute devolver un valor
verdadero
La funcin Execute debera ejecutar la accin
definida como propiedad
ViewModel
Crea una clase pblica llamada BaseViewModel
que implemente la interface
INotifyPropertyChanged, sta clase sera la base
para todos los ViewModels, recuerda usar el
atributo CallerMemberName
ViewModel
Ahora crea una clase pblica llamada NewsViewModel, sta debe de
heredar de la clase base BaseViewModel
Encapsula las propiedades que desees enlazar a la vista de la aplicacin
(en este caso crears una propiedad llamada city y en el accesor set
llama a la funcin OnPropertyChanged para notificar el cambio)
Sigue el mismo procedimiento con
con una propiedad del tipo
ObservableCollection<New>
ViewModel
Crea una propiedad privada de la clase
NewsService, e inicializala dentro del constructor
del ViewModel junto con el manejador del evento
GetNewsCompleted
ViewModel
Crea una propiedad de la clase ActionCommand y encapslala, se debe
de crear una clase por cada comando deseado dentro de la vista
Dentro del accesor get, checa que si el campo no es nulo, de ser as,
crea una nueva instancia del campo getNewsCommand, asignandole
una accin por medio de una expresin lambda
Dentro del cuerpo de la accin, manda
a llamar la funcion GetNews,
que pertenece a la propiedad
del tipo NewsService
View
Importemos el espacio de nombres de
ViewModels a la ventana XAML
View
Dividimos en dos filas nuestro Grid principal, y le
asigamos a la propiedad DataContext el
ViewModel alojado en el diccionario de recursos
View
A la primera fila le agregamos una caja de bsqueda y un botn para
iniciar una bsqueda de noticias, enlazandolo a nuestro comando de
noticas; podemos usar algn DataTemplate para darle estilo a nuestro
botn
View
A la segunda fila le agregamos un elemento
ListBox, el cual estar enlazado a nuestra lista de
noticias en el ViewModel, creando un
ItemTemplate para cada elemento en el ListBox
Resultado