WPF
WPF
Windows
Presentation
Foundation
por Luis Alfonso Rey
Prlogo
Apartado IV
Para mi mujer y mis hijos, que son mi inspiracin para hacer todos los das,
lo que hago.
Dado el carcter introductorio y no enciclopdico del libro, las siguientes
pginas pretenden ser una presentacin ms o menos detallada de lo que es
WPF pero no exhaustiva. Esto sita este libro en el mbito de los manuales
prcticos y no en el de los libros de referencia.
La segunda advertencia que hay que realizar es que todos los ejemplos del
libro han sido realizados con la versin de Visual Studio 2010 ltimate y esto
puede presentar alguna discrepancia si se trata de seguir el libro con versiones
diferentes, evidentemente si estas lo son en cuanto a la versin, en ocasiones
estas discrepancias pueden ser ms evidentes.
Dicho esto y antes de entrar en materia, vamos a explicar qu es WPF. Muchos
de los lectores ya lo sabrn en mayor o menor medida, razn por la cual estn
leyendo este libro, pero para aquellos que no lo tengan claro empezaremos
diciendo que Windows Presentation Foundation es una tecnologa para crear
Gua prctica de desarrollo de aplicaciones Windows en .NET
El Modelo De
Aplicacin
Al empezar lo mejor es hacerlo por el principio, y este en Windows es hablar de
qu tipo de aplicaciones se pueden crear con WPF.
Estas pueden ser bsicamente dos, aplicaciones Windows y aplicaciones de
Navegacin.
Aplicaciones de Windows
Las primeras son ms convencionales y en cuanto al modelo de aplicacin se
puede decir que muy similares a sus primas de WinForms.
Las aplicaciones Windows est encapsuladas en una clase de tipo Application,
esta clase es la responsable de crear y gestionar la vida de la aplicacin,
devolver los cdigos de salida, procesar los parmetros de lnea y en ocasiones
gestionar la navegacin.
EndSub
C#
private void Application_Exit(object sender,
ExitEventArgs e)
{
MessageBox.Show("Adios");
}
Tras la ejecucin la aplicacin mostrar un cartel cada vez que la cerremos.
Aplicaciones de navegacin
Las aplicaciones de navegacin son un nuevo modelo de aplicaciones
propuestas por WPF que pueden resultar muy interesantes. Se caracterizan
fundamentalmente por el estilo que tienen de transitar entre su ventanas, o
tambin llamadas pginas. El trnsito se produce de una manera muy similar a
como se produce en las aplicaciones Web, mediante enlaces y mtodos que nos
remiten a una URI. Adems estas aplicaciones tambin tienen un servicio de
navegacin que recuerda los sitios visitados y nos permite retornar a ellos,
del mismo modo que en una aplicacin Web.
Habitualmente estas aplicaciones se ejecutan dentro del navegador, usando en
algunos casos los propios controles para manejar resortes de su mecanismo de
navegacin. Esto merece una explicacin ms detallada, que la aplicacin se
ejecute dentro del navegador no significa que sea una aplicacin Web. De
hecho no lo es en absoluto, es una aplicacin Windows que se ejecuta alojada
en el navegador y que necesita, como las aplicaciones Windows, que el
Framework se encuentre instalado en la mquina. En esto difieren de las
aplicaciones Silverlight, que se ejecutan dentro del mbito del navegador pero
no necesitan el Framework sino un Plug-in que hace las veces de ejecutor.
Adems tambin se consideran aplicaciones de navegacin aquellas
aplicaciones Windows de WPF pero que hacen uso de la clase
PageFunction<t> o PageFunction(Of t).
Para ejemplificar estas aplicaciones podemos crear una nueva WPF
Application y en ella agregar una nueva Page Function. Dentro de la etiqueta
<Grid> podemos situar el siguiente cdigo:
XAML
<TextBlock>Pruebadenavegacin</TextBlock>
Posteriormente en la ventana principal MainWindow.xaml depositar un nuevo
botn desde la ToolBox y tras hacer doble clic sobre l, insertar en el cuerpo
del gestor del evento asociado:
Visual Basic.NET
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles Button1.Click
Dim wizard As New NavigationWindow()
wizard.Source = New Uri("PageFunction1.xaml",
UriKind.Relative)
wizard.ShowDialog()
EndSub
Gua prctica de desarrollo de aplicaciones Windows en .NET
C#
private void button1_Click(object sender,
RoutedEventArgs e)
{
NavigationWindow wizard = new
NavigationWindow();
wizard.Source = new Uri("PageFunction1.xaml",
UriKind.Relative);
wizard.ShowDialog();
}
En el caso de las aplicaciones de navegacin la clase Application se sustituye
por su derivada NavigationApplication que nos provee de los servicios y
miembros necesarios para articular una aplicacin de navegacin.
El primer miembro del que hablaremos ser una propiedad, StartUpURI que
nos permite especificar la pgina de inicio de la aplicacin. Para dar soporte a
la posterior navegacin la aplicacin contiene un NavigationService. Este
servicio no controla la pgina que actualmente se est mostrando sino el
camino que se ha seguido para alcanzarla. Acceder a l es algo oscuro, se hace
a travs del mtodo GetNavigationService que exige un parmetro de tipo
DependantObject, que ahora es precipitado explicar pero, que para entenderlo
rpidamente es un objeto de WPF. En ese sentido el mecanismo ms fcil de
satisfacer este parmetro es utilizando un formulario o un control dentro de
este. Una vez obtenido este servicio l nos provee de mtodos como GoBack o
GoFoward para movernos por el historial o Navigate que nos permite dar un
salto incondicional a una pgina cualquiera de la aplicacin.
De vuelta a la NavigationApplication no debemos olvidar que esta nos
provee de ciertos eventos para controlar la navegacin como Navigating,
Navigated, NavigationProgress, NavigationFailed, NavigationStopped y
LoadCompleted, todos ellos destinados a controlar los diferentes estados por
los que pasa la aplicacin tanto durante la navegacin como en funcin del
resultado de esta.
Para crear una de estas aplicaciones hemos de seleccionar una plantilla
diferente, en concreto WPF Browser Application. Un cdigo de ejemplo para la
invocacin de un mtodo de navegacin podra ser este:
Visual Basic .NET
NavigationService.GetNavigationService(Me).Navigate(New
Uri("Page1.xaml",UriKind.Relative))
C#
NavigationService.GetNavigationService(this).Navigate(new
Uri("Page1.xaml",UriKind.Relative));
Gua prctica de desarrollo de aplicaciones Windows en .NET
Conclusin
WPF nos ofrece diferentes modelos de aplicacin, que nos permiten
adaptarnos mejor a situaciones en las cuales un interfaz es mejor entendido, o
presenta ventajas que nos permiten mejorar procedimientos como el
despliegue o el control de la seguridad.
A continuacin
En el captulo siguiente trataremos la especificacin XAML, que nos servir
para que de manera declarativa podamos crear interfaces. Adems trataremos
algunos aspectos bsicos de XML con el fin de facilitar la compresin de aquel
lector que est menos familiarizado con ellos.
Windo
ows Presenttation Foun
ndation | 305
XA
AML
L
En ell epgrafe an
nterior hemo
os comprobaado como un
na determinada
caraccterstica differencia susttancialmentte WPF del resto
r
de apliccaciones .NE
ET,
el XA
AML. Digo diferencia
d
au
unque existe n otros tipos de aplicaciiones que
utilizzan formulacciones simila
ares. Sin em
mbargo es inn
negable que a simple vissta
el XA
AML se aplicca de manera nica a estte tipo de prroyectos.
Pero,, qu es exa
actamente XAML?,
X
puess un acrnim
mo de eXten
nsible
Appliication Mark
kup Langua
age esto es, u
un XML para
a definir aplicaciones. L
Las
defin
ne a modo dee formato de
e serializacin de objeto
os, lo que quiere decir qu
ue
nosottros escribim
mos un XML
L que posterriormente seer ledo e in
nterpretado de
form
ma que cada elemento
e
de
entro de l see
conveertir en un objeto denttro de la
aplicaacin, y gen
neralmente dentro
d
de un
na
ventaana o pgina
a.
Este proceso pueede sonar mu
uy similar al que
se prroduce con el
e HTML porrque de hech
ho lo
es. Esspecficamente se han buscado
b
las
ventaajas de cada uno de los entornos
e
de
desarrrollo para conformar
c
WPF
W y en estte caso la ven
ntaja princip
pal es la
separracin efectiiva que nos permite
p
estee modelo, dee forma que desarrollad
dor y
dise
ador pueda
an trabajar sobre la mism
ma ventana de manera separada
s
y
coinccidente o no, en el tiemp
po.
Gua prctica de
e desarrolllo de aplica
aciones Win
ndows en .N
NET
306 | Window
ws Presenta
ation Found
dation
Ms een detalle un
n fichero XA
AML es un fiichero XML
L y aunque ca
asi todo el
mund
do compren
nde bien cm
mo funciona un fichero XML
X
aqu va
amos a inverrtir
unas lneas para que posterio
ormente tod
do se entiend
da correctam
mente.
XM
ML
Fueraa de explicacciones hist
ricas, podem
mos decir qu
ue un fichero
o XML es un
n
fichero de texto formado
f
porr marcas y q
que al menoss ha de estarr bien
form
mado.
bien formado
o se entiend
de:
Por b
1.
Q
Que los docu
umentos han
n de manten
ner una estru
uctura estrictamente
jeerrquica.
2. Q
Que los docu
umentos han
n de tener un
n solo elemeento raz.
3. Q
Que los atrib
butos siemprre deben maarcar su conttenido entre
e comillas.
4. Q
Que es sensib
ble a maysculas y min
sculas.
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Representacin
En XAML tienen representacin casi todas las clases relacionadas con WPF, y
se usan por tanto para establecer que objetos van a componer una ventana, por
ejemplo.
Dentro de un archivo XAML los elementos representan objetos mientras que
los atributos propiedades. Esto sera por tanto un botn con una anchura de
30 y de color Rojo:
XAML
<Button Width=30 Background="Red" />
C#
public static readonly DependencyProperty
NombreProperty =
DependencyProperty.Register(
"Nombre", typeof(Tipo),
);
public bool Nombre
{
get { return (Tipo)GetValue(NombreProperty); }
set { SetValue(NombreProperty, value); }
}
310 | Windows
s Presentattion Found
dation
Pensemos por un
n momento una situacin que es mu
uy comn en
n WPF y en
otross sistemas dee programaccin, un botn dentro dee un panel. Comnment
C
te
en cu
ualquier sisteema de prog
gramacin aal hacer clic sobre
s
el bot
n no tenem
mos
dudaa de que el evvento a gestiionar es el C
Click del bot
n. Esto es as
a porque
estam
mos ante lo que
q se llama
a un evento d
directo, slo
o salta en el receptor
r
dirrecto
del eestmulo.
Sin eembargo esto
o no es as en
n los eventoos enrutadoss. En estos ell estmulo ess
propaagado a lo la
argo de todo
os los controoles de la jerarqua, o sea
a, en el ejem
mplo
tanto
o en el botn
n como en ell panel. Peroo para qu sirve
s
esto? Esto
E
permitee
articu
ular una carracterstica de
d WPF que es la capacidad de crearr controles
comp
plejos anidan
ndo otros ms
m simples, cosa que exploraremos ms adelan
nte.
De heecho y para complicarlo
o ms, la estrrategia de prropagacin no es para
todoss los eventoss igual. En algunos
a
casoos ante el clicc al botn el estmulo seera
enviaado primero
o al contened
dor ms geneeral, el paneel, denomina
ando esta
estraategia Tunneel y en ocasio
ones al conteenedor ms concreto, denominandoo en
este ccaso Bubble.
Com
nmente loss eventos de tipo Tunneel se nombra
an empezand
do por la
palab
bra Preview.. Los eventos enrutados tambin suelen ir en pa
arejas, as all
PreviiewMouseLeftButtonDo
own le correesponde un MouseLeftB
M
ButtonDown
n.
Cuan
ndo sobre un
n control se produce
p
un estmulo, po
or ejemplo un
u clic, este ees
propaagado primeero siguiend
do la estrateggia Tunnel, para
p
luego continuar
c
coon la
Bubb
ble. Todas ellla comparte
en la misma instancia dee evento que
e se propagaa a lo
largo
o de todos los eventos.
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Esta cadena se puede finalizar, dando el evento por gestionado, en algn punto
tan solo estableciendo la propiedad Handled a True, propiedad localizada en la
estructura EventArgs correspondiente del evento.
Visual Basic .NET
Public Shared ReadOnly EventoEvent As RoutedEvent =
EventManager.RegisterRoutedEvent("Evento",
RoutingStrategy.Bubble, GetType(RoutedEventHandler),
GetType(TipoClase))
Public Custom Event Evento As RoutedEventHandler
AddHandler(ByVal value As RoutedEventHandler)
Me.AddHandler(EventoEvent, value)
End AddHandler
RemoveHandler(ByVal value As RoutedEventHandler)
Me.RemoveHandler(EventoEvent, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As
RoutedEventArgs)
Me.RaiseEvent(e)
End RaiseEvent
End Event
C#
public static readonly RoutedEvent EventoEvent =
EventManager.RegisterRoutedEvent(
"Evento", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(TipoClase));
public event RoutedEventHandler Evento
{
add { AddHandler(EventoEvent, value); }
remove { RemoveHandler(EventoEvent, value); }
}
Layout
Border
Canvas
DockPanel
Grid
Define una rejilla donde situar los controles en funcin de filas y columnas.
GroupBox
Es un control que contiene otros controles definiendo para ello un borde y una
cabecera.
ScrollViewer
StackPanel
Viewbox
Window
WrapPanel
Sita los elementos en una sola lnea de forma que cuando se alcanza el final
de esta se produce una ruptura para ocupar la siguiente.
Botones
Button
RepeatButton
Datos
DataGrid
ListView
Es un control que nos permite mostrar elementos como una lista de datos.
TreeView
Fecha
Calendar
DatePicker
Mens
ContextMenu
Menu
Representa un men que agrupa las acciones globales para toda una
aplicacin.
ToolBar
Seleccin
CheckBox
ComboBox
ListBox
RadioButton
Slider
Navegacin
Frame
Hyperlink
Page
Encapsula el contenido de una pgina que puede ser navegada por IE.
Dilogo
SaveFileDialog
Informacin de
usuario
AccessText
Label
Popup
ProgressBar
StatusBar
TextBlock
ToolTip
Documentos
DocumentViewer
FlowDocumentPageViewer
FlowDocumentReader
Input
TextBox
RichTextBox
PasswordBox
Medios
Image
MediaElement
Cursor
Visibility
Width, Height
Dimensiones de control.
MinWidth,
MaxWidth,
MinHeight,
MaxHeight
Margin
Padding
Bubble
LostMouseCapture
Bubble
MouseLeftButtonUp
Bubble
MouseLeftButtonDown
Bubble
MouseRightButtonUp
Bubble
MouseRightButtonDown
Bubble
MouseMove
Bubble
MouseWheel
Bubble
PreviewMouseLeftButtonUp
Tunnel
PreviewMouseLeftButtonDow
n
Tunnel
PreviewMouseRightButtonUp
Tunnel
PreviewMouseRightButtonDo
wn
Tunnel
PreviewMouseMove
Tunnel
PreviewMouseWheel
Tunnel
GotFocus
Bubble
LostFocus
Bubble
KeyUp
Bubble
KeyDown
Bubble
TextInput
Bubble
PreviewKeyUp
Tunnel
PreviewKeyDown
Tunnel
PreviewTextInput
Tunnel
Conclusin
WPF logra una separacin efectiva entre desarrolladores y diseadores lo que
permite que ambos trabajen al mismo tiempo sin colisionar. Adems nos
provee de propiedades dependientes o eventos enrutados. Todas estas
caractersticas conforman una API de desarrollo consistente y que adems de
ofrecernos numerosas aportaciones tecnolgicas nos aade un mundo nuevo
en cuanto al desarrollo en equipo.
A continuacin
Los diferentes dispositivos a los que se puede aplicar WPF producen que la
adaptacin a las diferentes pantallas sea crtica. Es por esa razn entre otras,
que necesitamos un potente sistema de gestin y racionalizacin de los
espacios. En el siguiente captulo veremos en que consiste.
Paneles Y
Layout
En WPF el diseo y la distribucin de los elementos son, si cabe, ms
importantes que otros sistemas de programacin. El principal motivo es que
tanto el diseo como la distribucin de los elementos son uno de los
principales motivos por los que realizamos proyectos en WPF.
En estas lneas no vamos a adentrarnos en estos conceptos como tal, diseo y
distribucin de los controles, ya que quedan fuera del mbito de este libro pero
s que intentaremos sentar unas bases de conocimiento para que las
experiencias anteriores con otros sistemas de programacin se puedan
reutilizar con WPF.
El primer concepto que tenemos que tener claro es que cada elemento en WPF
ocupa un rectngulo de espacio al ser mostrado. El tamao de este rectngulo
se computa a travs de una suma de factores, propiedades de diseo, espacio
disponible, panel contenedor, etc.
El tamao de cualquier objeto se puede recuperar a travs de clase
LayoutInformation y su mtodo GetLayoutSlot.
320 | Window
ws Presentation Found
dation
WPF
F entiende ell Layout com
mo un processo recursivo
o en el que to
odos los
elementos se possicionan, dim
mensionan y dibujan. Esste sistema se
s encarga d
de
realizzar este a lo largo de tod
dos los elemeentos y sus contenidos,
c
completand
do
as laa presentaci
n.
La fu
uncionalidad
d antes descrrita es de esp
pecial comp
plejidad en lo
os paneles, yya
que eestos a difereencia del ressto de comp onentes sueelen contener multitud d
de
hijos, elementos contendidos en su interrior, que disstribuir.
mentos y en especial
e
los paneles proveen de dos mtodos
Para eso los elem
MeassureOverrid
de y ArrangeeOverride qu
que nos perm
miten realiza
ar los clculoos
oporttunos. El pro
oceso vendrra a ser as:
1.
U
Un elemento
o comienza midiendo
m
su
us propiedad
des bsicas.
2. D
Despus se evalan
e
las propiedades
p
heredadas de
d Framewo
orkElement,,
ccomo Width,, Height y Margin.
M
3. S
Se aplica la l
gica concre
eta de Panell.
4. E
El contenido
o se organiza
a despus dee medir todo
os los elemen
ntos
secundarios.
Se dibujan lo
os elementoss contenidoss.
5. S
Pa
aneles
Los eelementos ms
m importan
ntes dentro d
F
del desarrolllo de un diseo en WPF
son lo
os paneles. Estos
E
nos prroporcionan
n diferentes lgicas
l
de diistribucin qque
correectamente ap
plicadas, pueden simpliificar mucho
o la
confeeccin de intterfaces. Es por esta razzn que un
estud
dio de las differentes opcciones es sum
mamente tiil.
El prrimero de loss paneles a estudiar
e
es eel Canvas. Este
E
panel se caracterriza por perm
mitirnos disttribuir
librem
mente a lo la
argo y ancho
o del espacioo que ocupa los
difereentes elemeentos conten
nidos, hacien
ndo uso de la
as
propiiedades asocciadas Canv
vas.Top, Can
nvas.Left,
Canv
vas.Right y Canvas.Bott
C
tom.
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Windo
ows Presen
ntation Foundation | 321
XAML
L
s>
<Canvas
<But
tton x:Nam
me=Button
n1 Canvas
s.Top=10
Canvas.Left=10
/>
</Canva
as>
El Do
ockPanel es un panel en
n donde los eelementos see
pued
den distribuiir bien asocia
ados a lo larrgo de cualquiera
de los lados del panel,
p
bien ocupando
o
toodo el espaciio libre
restaante.
Cuen
nta con una propiedad
p
asociada DocckPanel.Docck, que
le ind
dica a cada elemento
e
com
mo se ha dee distribuir y una
propiiedad depen
ndiente LasttFillChild, qu
ue indica qu
ue se
debe hacer con el
e ltimo elem
mento inserrtado en el panel,
p
si ocu
upar con l todo
t
el espacio disponib
ble o no.
XAML
L
anel>
<DockPa
<But
tton x:Nam
me=Button
n1
DockPan
nel.Dock=
Top />
</DockP
Panel >
El Grrid es un pan
nel con la ca
apacidad de dividir su esspacio
en fillas y column
nas, situando
o en las celd
das resultanttes los
elementos.
umnas tenem
mos las
Para definir la fillas y las colu
propiiedades Row
wDefinitionss y ColumnD
Definitions,
form
muladas como
o sendas collecciones de RowDefinittion y
Colum
mnDefinitio
on respectiva
amente. En una fila el dato
d
ms iimportante a definir es la altura as RowDefinittion
cuentta con una propiedad
p
Height,
H
mien
ntras que las ColumnDeffinition tieneen
la pro
opiedad Wid
dth. En amb
bos casos la p
propiedad puede
p
ser esp
pecificada o no.
En esste ltimo ca
aso se consid
derar que lla dimensin
n especificad
da es Auto, eesto
es au
utodimension
nada, depen
ndiente del ttamao del contenido.
c
Tambin,
T
y
adem
ms de introd
ducir un enttero correspoondiente a la medida de
eseada,
podeemos especifficar * (asterrisco). En esste caso la diimensin de
e la fila o
colum
mna se comp
putar como
o una parte p
proporciona
al del espacio
o disponiblee, de
esta fforma si ten
nemos dos co
olumnas de aanchura * en
n un Grid, el
e asterisco
equivvaldr a la mitad
m
y si son
n tres a un teercio.
La co
osa se puedee complicar con
c los multtiplicadores,, que son n
meros enterros
que p
pueden aparrecer antes de
d los asterisscos. Cuando
o lo hacen no
n slo
multiiplican el tam
mao sino que
q aumentaan el nmero
o de partes en
e que divid
dir el
espaccio. De esa manera
m
un Grid
G
con doss columnas, la primera con
c dos
Gua prctica de
e desarrolllo de aplica
aciones Win
ndows en .N
NET
322 | Window
ws Presentattion Found
dation
Grid.Co
olumnSpan=
=2 Grid.
.Row=0/>
>
</Grid>
>
El Sta
ackPanel ess un panel qu
ue permite aapilar los
elementos conten
nidos con un
na orientaciin. Para
estab
blecer esta siimplemente hay que esp
pecificar su
propiiedad Orien
ntation a horrizontal o veertical.
XAML
L
Panel Orie
entation=
Vertical
>
<StackP
<But
tton x:Nam
me=Button
n1
<But
tton x:Nam
me=Button
n2
</Stack
kPanel >
/>
/>
Por
ltimo el WrrapPanel es un panel qu
ue dispone lo
os
elementos como si de escritu
ura se tratarra, de izquierrda a
dereccha. Cuando
o se alcanza el lmite porr la derecha el
panel parte la ln
nea de eleme
entos e inauggura una nu
ueva
lneaa. Tambin se puede cam
mbiar la orieentacin con
n la
propiiedad Orien
ntation.
XAML
L
anel Orien
ntation=H
Horizontal
l>
<WrapPa
<But
tton x:Nam
me=Button
n1
<But
tton x:Nam
me=Button
n2
<But
tton x:Nam
me=Button
n3
</WrapP
Panel >
/>
/>
/>
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Conclusin
La distribucin de los elementos dentro de una aplicacin es una de las tareas
que tiene ms importancia, ya que de ella pueden depender desde la usabilidad
hasta la comprensin que de ella hagan los usuarios. Con WPF contamos con
un conjunto de paneles que nos permiten crear "Layouts" regulares sin
necesidad de crear complejos diseos, tan slo utilizando estos paneles y la
capacidad anidatoria de WPF.
A continuacin
Los datos son lo ms importante de una aplicacin, y la comunicacin de estos
al usuario la misin principal de un interfaz. WPF como cualquier otra API de
interfaz posee un mecanismo para hacerlo automticamente. A continuacin
veremos este mecanismo.
Databinding y
Recursos
El Databinding es un proceso por el cual dos objetos sincronizan una de sus
propiedades entre si. Por ejemplo si en una aplicacin tenemos un objeto de
clase Persona la propiedad Nombre puede estar sincronizada con la propiedad
Text de un Textbox de manera automtica.
Esto es muy conveniente porque cualquier cambio que se produzca tanto en el
nombre como a travs del Textbox ser, inmediatamente comunicado
evitndonos as el enojoso proceso de detectarlo nosotros, as como la
correspondiente instruccin de asignacin.
Y esto no es una tontera, ya que en un formulario medio el nmero de estas
asignaciones puede llegar a ser bastante grande, complicando el cdigo y
evidentemente su mantenimiento.
Los interfaces
El cmo de este proceso involucra varios mecanismos as como diferentes tipos
de objetos que pueden verse involucrados desde el punto de vista de WPF.
Esto ltimo es importante y cabe resaltarlo de manera especial, lo que se
expondr a continuacin es solo vlido para WPF, otros mecanismos tanto en
.NET como fuera de la plataforma funcionan de manera distinta.
Para una rpida comprensin seguiremos con el ejemplo planteado en la
introduccin.
En este ejemplo podemos detectar dos procesos:
1.
Que el evento sea conocido por los controles, por lo que la manera ms
eficaz es enmarcarlo dentro de un interfaz. Este es
INotifyPropertyChanged, interfaz que posee un solo miembro
PropertyChanged, evento diseado para saltar cuando se produce una
modificacin en los datos de una propiedad.
C#
class Persona: INotifyPropertyChanged
{
string nombre;
public string Nombre
{
get { return nombre; }
set {
nombre = value;
OnPropertyChanged("Nombre");
}
}
public event PropertyChangedEventHandler
PropertyChanged;
private void OnPropertyChanged (string
property)
{
if (PropertyChanged != null)
PropertyChanged(this, new
PropertyChangedEventArgs(property));
}
}
Visual Basic.NET
Class Persona
Implements INotifyPropertyChanged
Private m_nombre As String
Public Property Nombre() As String
Get
Return m_nombre
End Get
Set
m_nombre = value
OnPropertyChanged("Nombre")
End Set
End Property
Public Event PropertyChanged As
PropertyChangedEventHandler
Private Sub OnPropertyChanged([property] As
String)
RaiseEvent PropertyChanged(Me, New
PropertyChangedEventArgs([property]))
End Sub
End Class
Gua prctica de desarrollo de aplicaciones Windows en .NET
El lector se habr dado cuenta de que este enlace se establece entre una clase y
un control nicos, es lo que se conoce como Databinding simple. Pero existe
tambin el Databinding mltiple, entre una lista de personas y un Listbox, por
ejemplo. En este caso no slo el contenido de la propiedad ha de ser tenido en
cuenta. En control necesita se avisado tambin cuando cambie la lista, por
ejemplo cuando se aadan o quiten personas.
Es por esto que existe el interfaz INotifyCollectionChanged que funciona de
manera anloga pero para las colecciones. Sin embargo no analizaremos en
detalle este interfaz, porque se antoja bastante menos til.
De un lado existen colecciones como ObservableCollection<t> u
ObservableCollection(Of t) que ya lo tienen implementado, por otro DataSets,
tablas de entidades y ObjectQuerys tambin lo implementan. De forma que no
es probable que el lector necesite implementarlo, sirvan estas lneas como
prueba de existencia de este interfaz.
Este cdigo establece la relacin entre las dos clases y es bastante fcil de
entender, si bien la tercera lnea merece una explicacin.
Esta lnea establece el modo de enlace, que nos permite establecer tres tipos de
relaciones:
1.
/>
/>
/>
1.
DataContext
La propiedad DataContext es una propiedad definida en la clase
FrameworkElement. Esta clase es el antecesor primero de todas las clases de
WPF. Esto quiere decir que cualquier elemento puede disponer de ella, pero
por qu es tan importante?
Podramos decir que la propiedad DataContext es un origen de datos por
defecto, es decir que en caso de que en una expresin de binding no
establezcamos un Source, el DataContext actuar en su lugar.
La ventaja principal de usar el DataContext es que este es parte del interfaz
principal de la clase al contrario del Source. Dicho en cristiano, al ser
DataContext una propiedad de la clase se puede asignar desde cdigo,
mientras que Source es una propiedad de la expresin que cuando menos es
mucho ms complicado de asignar.
En resumen el cdigo anterior quedara as:
C#
Persona p = new Persona();
TextBox1.DataContext = p;
Visual Basic.NET
Dim p As New Persona()
TextBox1.DataContext = p
Gua prctica de desarrollo de aplicaciones Windows en .NET
XAML
<TextBox x:Name=TextBox1 Text="{Binding
Path=Nombre}" />
/>
El binding mltiple
Hasta ahora nos hemos ocupado del binding simple, pero ya es hora de
ocuparnos de mltiple.
Este es un binding que se establece entre una coleccin, lista, tabla, etc. y un
control como el ListBox, el ComboBox o el DataGrid.
Estos controles poseen la capacidad de mostrar un conjunto de datos y no slo
uno.
Todos estos controles poseen una propiedad comn que les permite funcionar,
la propiedad ItemsSource. Esta propiedad se encarga de establecer la coleccin
que sirve de origen para los datos.
Tambin es posible establecer la propiedad ItemsSource mediante una
expresin, en concreto la expresin {Binding}. Esta expresin establecida en la
propiedad informa que el DataContext establecido ms prximo se asigna sin
restricciones como ItemsSource.
Evidentemente el DataContext ha de contener una coleccin, de no ser as el
enlace no funcionara.
Otra propiedad que tienen los controles de binding mltiple es
IsSynchronizedWithCurrentItem. Esta propiedad booleana es muy importante
ya que informa al control de cual es su entorno de binding. Para entender esto
debemos entender como funciona el binding de las colecciones.
Cuando enlazamos una coleccin con una serie de elementos de binding
simple, estos crean una clase de intermediacin que necesariamente
implementa el interfaz ICollectionView. Se utiliza esta clase de intermediacin
a fin de soportar el ordenamiento y el filtrado sin necesidad de modificar la
coleccin origen.
De cualquier modo, todos los controles de binding simple comparten View. No
es as con los de binding mltiple, cada uno de ellos inaugura un nuevo View
para su uso exclusivo. La consecuencia principal de esto es que si tenemos un
TextBox mostrando el Nombre de la persona actual y al mismo tiempo una
ListBox mostrando la lista completa de las personas, ambos elementos no
estarn sincronizados, o sea cambiando el elemento seleccionado en el ListBox
no cambiar el nombre que se muestra en el TextBox.
Sin embargo si establecemos la propiedad IsSynchronizedWithCurrentItem a
True esta sincronizacin si tendr lugar. Esto es as porque el ListBox se
sumar al View que utilizan los TextBoxes.
Finalmente nos resta revisar algunos de los controles de binding mltiple. No
es posible hacerlo con todos porque sera un trabajo muy largo y no aportara
demasiado as que nos centraremos en un par de ellos, el ListBox y el
DataGrid.
El ListBox es capaz automticamente de mostrar una coleccin de cadenas, sin
embargo cuando la coleccin es de objetos esto no es tan simple.
Para poder mostrar estos elementos caben dos estrategias, la plantilla de
datos, que revisaremos en el captulo dedicado a las plantillas o mediante las
propiedades DisplayMemberPath que nos permite establecer la propiedad o
ruta del dato a mostrar y SelectedValuePath que nos permite establecer la
Gua prctica de desarrollo de aplicaciones Windows en .NET
XAML
<DataGrid ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn x:Name="iDColumn"
Binding="{Binding Path=ID}" Header="ID" />
<DataGridTextColumn
x:Name="nombreColumn" Binding="{Binding Path=Nombre}"
Header="Nombre" />
<DataGridTextColumn
x:Name="apellidosColumn" Binding="{Binding
Path=Apellidos}" Header="Apellidos" />
</DataGrid.Columns>
</DataGrid>
Conversores
Hasta ahora hemos estado jugando con ventaja cuando nos referimos al
binding. Bsicamente y de manera implcita hemos estado enlazando
propiedades compatibles, es decir, que comparten tipo o cuyos tipos son
compatibles, pero esto no tiene por que ser as.
En ocasiones cuando dos propiedades se relacionan por binding los tipos de
ambas no son idnticos ni compatibles por lo que necesitamos un conversor.
Un conversor no es ni ms ni menos que una clase que implementa un
interfaz, IValueConverter, y que es utilizado como intermediador de las
operaciones de binding, antes de que el contenido de una propiedad se
sincronice con otra se pasa por el conversor a fin de que los datos de ambas
propiedades sean compatibles.
C#
public enum AgeGroups
{
Young = 18,
Mature = 60,
Old = 150
}
[ValueConversion(typeof(int), typeof(string))]
public class AgeConverter : IValueConverter
{
public object Convert(object value, System.Type
targetType, object parameter,
System.Globalization.CultureInfo culture)
{
Gua prctica de desarrollo de aplicaciones Windows en .NET
En cualquier caso se recomienda al lector revisitar esta seccin una vez se haya
ledo los epgrafes relacionados con recursos.
Validacin
La validacin es el proceso por el cual el dato se prueba correcto antes de ser
definitivamente asignado por un proceso de binding.
Este proceso de validacin se puede llevar a cabo de varias maneras, con el fin
de que utilicemos la que ms nos convenga.
Gua prctica de desarrollo de aplicaciones Windows en .NET
En este ejemplo podemos ver como se valida una propiedad que es evaluada
para que la longitud no sea menor que 0. Para que la expresin sea sensible a
estos errores hemos de habilitar ValidatesOnDataErrors en vez de el
ValidatesOnExceptions anterior, aunque sean perfectamente compatibles.
XAML
Text="{Binding Nombre, Mode=TwoWay,
ValidatesOnDataErrors=True,
NotifyOnValidationError=True}"
XAML
<TextBox>
<TextBox.Text>
<Binding Path="Age"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<c:NewRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
342 | Window
ws Presentattion Found
dation
Todo
o esto se agra
avaba especcialmente en
n el caso del binding, ya que no exissta
ning
n tipo de siimplificacin
n y ayuda en
n lo que posiiblemente se
e pueda
consiiderar el meecanismo m
s difcil de ttoda la tecno
ologa.
Aforttunadamentte esto ha cambiado en V
VS2010. Son
n muchas lass mejoras qu
ue
se haan incorpora
ado, pero en lo tocante aal binding so
on bsicamente dos: el
edito
or de expresiiones y los orgenes de d
datos.
.
El ed
ditor de exprresiones sim
mplifica drstticamente ell clculo de expresiones
e
Como
o podemos ver
v en la
prim
mera imagen el editor noss
perm
mite estableccer la mayora
de lass opciones de
d binding
mediiante un edittor visual. Lo
cual ees sumamen
nte til porq
que
si bieen los bindin
ngs sencilloss
son ffciles de esttablecer por
cdiggo, los meno
os evidentes
pued
den ser basta
ante difciless.
Tamb
bin podemo
os observar
que eel origen de datos, en la propiedad S
Source se pu
uede establecer sin
probllemas ya pro
ovengan estos de una baase de datoss, de otro ele
emento denttro
del in
nterfaz o de un recurso, como verem
mos un poco
o ms adelan
nte en este
mism
mo captulo.
Es taambin posib
ble establece
er el resto dee parmetro
os de las expresiones de
bindiing a travs del editor. Como
C
se ve een la segund
da imagen po
odemos
estab
blecer la prop
piedad Path
h que se nos mostrar co
ontextualizada al Sourcee
que h
hayamos eleegido. Tambiin se nos peermitir seleeccionar el conversor
c
dee las
propiiedades de formato,
f
mo
odo
y valiidacin.
La seegunda de la
as
integgraciones qu
ue nos aporta
a
VS ess la integracin con la
ventaana de Orgeenes de Dato
os.
Cuan
ndo incluimo
os en nuestrro
proyeecto un Data
aSet o un
ObjecctContext (E
Entity
Fram
mework) estee
autom
mticamente se asocia con
c
la ven
nta de orgenes de datoss e
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Windo
ows Presenttation Foun
ndation | 343
inmeediatamente se publican
n tanto sus taablas u ObjeectQuerys co
omo los
difereentes campo
os/propieda
ades que con
ntienen. De esta
e
manera con un simp
mple
pulsaar y arrastra
ar podemos depositar
d
loss diferentes controles en
n el formulaario.
Adem
ms esta ven
ntana nos permite selecccionar el con
ntrol de edicin, que porr
ejemplo en el casso de una tab
bla puede seer un DataG
Grid, un ListV
View o un
conju
unto de conttroles que co
onforman un
n editor tipo
o ficha.
ms esta ven
ntana no slo
o inserta con
ntroles sino que
Adem
la auttomatizacin incluye la insercin deel cdigo pa
ara
rellen
nar el DataS
Set o abrir el ObjectConttext. Al haceer
esto iinserta tamb
bin un elem
mento en el m
marcado, en
n
concrreto en el rrea de recurssos que es un
n
ColleectionViewSo
ource que se
er, junto coon los
DataP
Providers, el
e objetivo de
e nuestro sigguiente puntto.
Da
ataPrrovide
ers y
Co
ollecc
cionViewSo
ource
e
Cuan
ndo hablamo
os del bindin
ng mltiple h
hablamos ta
ambin de la
a estructura
interna que este tena, de com
mo cada colleccin creab
ba un IColle
ectionView y de
como
o este objeto
o era necesarrio para inteermediar a fiin de soportar ordenacin y
filtraado, ahora ab
bordaremos como.
Gua prctica de
e desarrolllo de aplica
aciones Win
ndows en .N
NET
C#
...
ICollectionView cv;
public ICollectionView CV
{
get {
if (cv == null)
cv =
CollectionViewSource.GetDefaultView(this.Resources["li
Gua prctica de desarrollo de aplicaciones Windows en .NET
Visual Basic.NET
...
Private m_cv As ICollectionView
Public ReadOnly Property CV() As ICollectionView
Get
If m_cv Is Nothing Then
m_cv =
CollectionViewSource.GetDefaultView(Me.Resources("list
a"))
End If
Return m_cv
End Get
End Property
Recursos
Los recursos son uno de los elementos ms importantes de WPF. De hecho ya
hemos visto que nos permiten cosas como introducir elementos no visuales en
marcado, pero adems de esto en los siguientes captulos veremos muchos ms
usos que nos mostrarn el potencial de los recursos en WPF. Ahora toca
explicar qu son y cmo afectan al binding.
Los recursos corresponden a la propiedad Resources que se define en la clase
FrameworkElement. Esto significa que estn disponibles en todos los
elementos que de ella descienden, de facto en todas las clases de WPF.
Esta propiedad est formulada como del tipo ResourceDictionary. Este tipo
vendra a ser lo mismo que un diccionario de objetos cuyas claves tambin son
objetos. Esto quiere decir que tenemos una coleccin cuyos elementos tienen
cada uno una clave y un valor que son objetos.
Debido a esto en los recursos se puede guardar cualquier cosa, lo que los hace
muy verstiles, pero adems los recursos tiene una forma de funcionar que les
permite en tiempo de ejecucin comportarse casi como si fueran una
propiedad creada a partir de toda la jerarqua de elementos en XAML. Esto
quiere decir que si tenemos un botn dentro de un panel y a su vez el panel
dentro de una ventana, y accedisemos en el botn a los recursos mediante
una expresin de binding, esta buscara el origen de datos en los recursos del
botn, si no en el panel y por ltimo en la ventana hasta encontrarlo.
Comportamiento este muy similar al de los DataContext.
Las expresiones de binding de recursos son muy sencillas, como todas ellas
van enmarcadas por sendas llaves para a continuacin cambiar la palabra
binding por StaticResource o DynamicResource. La nica propiedad que
ambas tienen es ResourceKey que indica, por su nombre el recurso al que nos
queremos referir.
XAML
<Page Name="root"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr
Gua prctica de desarrollo de aplicaciones Windows en .NET
Como se puede ver en el ejemplo hemos creado un recurso de tipo brocha con
el que luego establecemos el color de la fuente de un TextBlock. Una de las
cosas importantes que hay que recalcar en el caso de los recursos, es que todos
ellos han de establecer la propiedad x:Key, ya no porque de otra manera no se
podran asignar, si no porque estos elementos bsicamente representan una
coleccin en la que la propiedad Key es obligatoria y si no se asigna la clase
correspondiente, ResourceDictionary, no se podra crear.
Conclusin
Los procesos de binding estn diseados para facilitarnos el cdigo, una
correcta inclusin de ellos puede hacer que nuestro cdigo se reduzca
considerablemente, al tiempo que delegamos tareas pesadas en el propio
sistema. WPF nos permite hacer uso de un motor de binding muy potente.
A Continuacin
Los comandos son un buen recurso, disponible en WPF, para crear
funcionalidad y asignarla de manera consistente a mltiples controles y de
manera consistente a lo largo de nuestro interfaz. En el siguiente captulo
veremos por qu.
Comandos
Podramos describir los comandos como pedazos de funcionalidad que se
pueden asignar a determinados tipos de controles, botones y mens, pero que
adems estn asociados con un gesto de entrada, bsicamente una
combinacin de teclas, ratn y/o lpiz ptico.
Esto en principio puede parecer bastante trivial, pero fundamentalmente nos
permite crear funcionalidad de manera consistente que luego pueda ser
desplegada y utilizada a lo largo de la aplicacin, o debidamente empaquetada
en otras aplicaciones.
De hecho un comando puede establecerse a nivel de control o de aplicacin, y
estos ltimos quedan debidamente registrados para poder ser invocados desde
cualquier lado en la aplicacin.
Redefinir un comando
En el modelo de objetos de WPF ya se incluyen la definicin de diferentes
comandos, por ejemplo ApplicationCommands, NavigationCommands,
MediaCommands, EditingCommands y ComponentCommands. En algunos
casos estos comandos contienen ya una funcionalidad asociada, pero en otras
C#
RoutedCommand abrir;
InputGestureCollection gesto = new
InputGestureCollection();gesto.Add(new
KeyGesture(Key.L, ModifierKeys.Alt));abrir = new
RoutedCommand("Abrir", typeof(Application), gesto);
Visual Basic.NET
Dim abrir As RoutedCommand
Dim gesto As New InputGestureCollection()
gesto.Add(New KeyGesture(Key.L, ModifierKeys.Alt))
abrir = New RoutedCommand("Abrir",
GetType(Application), gesto)
Visual Basic.NET
Class AbrirCommand
Implements ICommand
Public Function CanExecute(parameter As Object)
As Boolean
Return True
End Function
Public Event CanExecuteChanged As EventHandler
Public Sub Execute(parameter As Object)
Application.Current.Shutdown()
End Sub
End Class
XAML
<Window x:Class="EjercicioVI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr
esentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:miapp="clr-namespace:EjercicioVI"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<miapp:AbrirCommand x:Key="comando" />
</Grid.Resources>
<Menu>
<MenuItem Header="Archivo">
<MenuItem Header="Salir"
Command="{StaticResource comando}" />
</MenuItem>
</Menu>
<ToolBarTray Grid.Row="1">
<ToolBar>
<Button Content="Salir"
Command="{StaticResource comando}" />
</ToolBar>
</ToolBarTray>
<TextBox x:Name="Texto" Grid.Row="2"
AcceptsReturn="True" />
</Grid>
</Window>
}
Visual Basic.NET
Public Class Comentario
Inherits ContentControl
Shared Sub New()
DefaultStyleKeyProperty.OverrideMetadata(GetType
(Comentario), New
FrameworkPropertyMetadata(GetType(Comentario)))
CommandManager.RegisterClassCommandBinding(GetTy
pe(Comentario), New CommandBinding(_ocultar,
ocultando))
CommandManager.RegisterClassInputBinding(GetType
Gua prctica de desarrollo de aplicaciones Windows en .NET
Comandos en 4.0
En la versin 4.0 del Framework se han incluido algunas caractersticas
nuevas para el trabajo con comandos, para la simplificacin del proceso.
En concreto se ha creado la etiqueta KeyBinding. Que se sita en una coleccin de recursos, ya que no es visual y es capaz de enlazar con un comando
escrito como propiedad de la ventana a la que pertenece, y esto, y aqu viene el
ahorro, sin necesidad de insertar en marcado el espacio de nombres XML.
C#
public partial class MainWindow : Window
{
public EHCommand Comando { get; set; }
public MainWindow()
{
...
}
}
Visual Basic.NET
Public Partial Class MainWindow
Inherits Window
Public Property Comando() As EHCommand
Get
Return m_Comando
End Get
Set
m_Comando = Value
End Set
Gua prctica de desarrollo de aplicaciones Windows en .NET
A Continuacin
Los comandos nos ayudan a definir funcionalidad de una manera muy regular
y exportable, que sin duda permite crear un interfaz de conexin entre las
ventanas de la aplicacin y la lgica de negocio.
Esto adems permite que de manera extraordinariamente rpida podamos
realizar drsticos rediseos o propagar la solucin a un error encontrado
inmediatamente.
A Continuacin
XAML al igual que HTML es compatible con un sistema de estilos, que nos
permite variar rpidamente los estilos de una aplicacin. Adems veremos que
es una plantilla, que de manera sorprendente nos va a permitir redibujar
cualquier control a nuestro antojo.
Gua prctica de desarrollo de aplicaciones Windows en .NET
Estilos Y
Plantillas
Cuando Microsoft decidi crear WPF varias fueron las cosas en las que se
inspir. Pero quiz una de las ms significativas fue el desarrollo web y las
tecnologas para hacerlo.
Efectivamente la idea del marcado no era nueva, as como la separacin
efectiva entre interfaz y lgica de interfaz. Estas caractersticas ya se haban
utilizado en el desarrollo web. Pero se quiso ir ms all y se introdujo tambin
una tcnica de plantillas para emular lo que en el mbito web hace CSS.
Adems, y no contentos con ello, se ha incluido un sistema de plantillas que
bien podra emular el comportamiento de los controles de servidor ASP.NET.
Estos controles se definen en el servidor, pero dado que no pertenecen a la
especificacin estndar de HTML, los navegadores no saben pintarlos. La
solucin se encuentra en que estos mtodos poseen un mtodo llamado
Render que se ejecuta antes de que la pgina sea servida, insertando el HTML
equivalente al control.
Algo similar hacen los controles en WPF. Cada control tiene lo que se conoce
como una plantilla que es un conjunto de Visuales que son insertados en el
Gua prctica de desarrollo de aplicaciones Windows en .NET
Estilos
En WPF entendemos por estilo una determinada configuracin en cuanto a las
propiedades de un objeto de una determinada clase. Cuando esta
configuracin se asigna, todos los valores se asignan, transmitiendo al objeto
un estado concreto.
Un estilo en WPF consiste bsicamente en una serie de asignaciones
establecidas por una tag <setter> dentro de una tag <style>.
XAML
<Button>
<Button.Style>
<Style>
<Setter Property="VerticalAlignment"
Value="Center" />
</Style>
</Button.Style>
</Button>
Plantillas de datos
A diferencia de un estilo una plantilla no persigue asignar una determinada
configuracin a varias de las propiedades de un objeto, sino slo a una de ellas.
En el caso de las plantillas de datos a la propiedad ItemTemplate.
Esta propiedad es donde reside la plantilla que se va a aplicar cuando se dibuje
un elemento de un objeto que pueda mostrar varios elementos, como por
ejemplo un ListBox.
Tomemos un proyecto con estas dos clases definidas:
C#
public class Persona
{
public string Nombre { get; set; }
public string Apellidos { get; set; }
}
public class ListaPersonas : List<Persona>
{
}
Visual Basic.NET
Public Class Persona
Property Nombre As String
Property Apellidos As String
End Class
Public Class ListaPersonas
Gua prctica de desarrollo de aplicaciones Windows en .NET
Obtendremos un ListBox con una serie de elementos que nos mostrarn en vez
del nombre y los apellidos, el nombre completamente calificado de la clase
Persona.
Si queremos que esto suceda de otra manera uno de los caminos que podemos
tomar es la de la plantilla de elementos. Para ello en la propiedad
ItemTemplate hay que hacer constar un DataTemplate.
XAML
<ListBox ItemsSource="{StaticResource lista}">
<ListBox.ItemTemplate>
<DataTemplate>
<Ellipse Width="10" Height="10" Fill="Red" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Como podemos ver ahora, y tras la aplicacin de la plantilla en vez del nombre
de la clase lo que aparece son unos crculos rojos. Eso es porque la plantilla
contiene eso en un crculo. Pero evidentemente lo que queremos es que
aparezcan los nombres y los apellidos, as que como es una plantilla de
Gua prctica de desarrollo de aplicaciones Windows en .NET
Plantillas de controles
Si las plantillas de datos estn diseadas para aplicarse all donde el dato las
necesita, las plantillas de controles estn especficamente diseadas para
repintar todo un control. Tomemos un botn:
XAML
<ControlTemplate x:Key="plantilla"
TargetType="Button">
<Border Width="{TemplateBinding Width}"
Gua prctica de desarrollo de aplicaciones Windows en .NET
Triggers
Si aplicamos el estilo anterior a un botn o conjunto de botones obtendremos
una desagradable desilusin, si bien es cierto que el estilo del botn est
completamente cambiado hemos perdido en el proceso la interactividad. Ya no
parece pulsarse cuando hacemos clic. Una solucin a este problema puede ser
agregar al estilo lo siguiente:
XAML
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="Red" />
</Trigger>
</Style.Triggers>
Gua prctica de desarrollo de aplicaciones Windows en .NET
Adems de estos tipos tenemos otro que nos resultar muy til el
EventTrigger. Es este un disparador que se vincula a un RoutedEvent,
detectando cuando este es elevado por el control. Si lo tratamos de manera
separada se debe a que su contenido no puede ser en ningn caso una serie de
Setters, ya que slo admite animaciones a travs de lo que se conoce como
StoryBoard.
Toda vez que las animaciones sern tratadas ms adelante pospondremos
hasta entonces la profundizacin en estos eventos.
Conclusin
Los estilos son una caracterstica bsica en HTML que se muestra muy til al
hora de especificar el aspecto visual de un sitio. En WPF tras la adaptacin de
esta tecnologa se va ms all y se integran tambin las plantillas que nos
permiten variabilizar completamente el aspecto visual de una aplicacin,
permitiendo de este modo precisar, a posteriori y sin necesidad de tocar ni
una sola coma del cdigo cualquier aspecto grfico de la aplicacin.
A Continuacin
Si algo podemos considerar una ventaja indiscutible en WPF es el apartado
grfico. Podemos crear grficos 2D y 3D, crear y controlar animaciones, aplicar
transformaciones y mucho ms. El nmero de recursos es sumamente amplio
y nos aporta una gran capacidad de personalizacin de aplicaciones. En el
siguiente captulo veremos cmo.
Grficos y
Animaciones
WPF es un sistema de presentacin que a diferencia de Windows Forms
persigue la creacin de interfaces impactantes, con mucha interactividad y
adems incluyendo contenido audiovisual con tanto ahnco como persigue la
creacin de aplicaciones de formularios.
Es por esto que se incluye en la API junto con clases como TextBox o Button,
clases como Rectangle, FloatAnimation o MediaPlayer. Y es por esto que las
aplicaciones adems de servicios de datos y aplicaciones para disearlos y
tratarlos tienen tambin, servicios y aplicaciones para crear novedosos
interfaces destinados a mejorar la usabilidad, la imagen de marca y la
percepcin de nuestras aplicaciones.
Todo el soporte grfico se basa en la clase Visual. Esta clase es la abstraccin
de la cual desciende todos los elementos en WPF.
Esta clase nos aporta soporte para renderizado, gestin de lmites, deteccin
de entradas y transformaciones, sin embargo no tiene soporte para eventos,
layout, estilos, Data Binding o globalizacin.
Graficos y renderizado
El nmero de elementos a cubrir en este punto valdra en si mismo para
escribir un libro, con lo cual el lector no ha de esperar un tratamiento
exhaustivo de lo que aqu exponemos, tan solo se pretende esbozar un ejemplo
en cada uno de los palos que componen el apartado grfico que bsicamente
seran: efectos, brushes, drawings, geometras, shapes y transformaciones.
Los efectos son algoritmos que aplicados a los diferentes elementos que
componen un interfaz WPF consiguen transformar la manera que tienen de
presentarse acorde con el carcter del efecto. Es decir, un DropShadowEffect
aplicado a un botn dibuja el botn como si este tuviera sombra. Toda esta
parte de la API sufri en el Framework 3.5 una intensa remodelacin que
condujo a la sustitucin de los antiguos BitmapEffect, no funcionales ya en
4.0, por los Effect. Actualmente la API consta de las siguientes clases:
Clase
Descripcin.
BlurEffect
DropShadowEffect
Effect
PixelShader
ShaderEffect
Las Brushes o brochas son bsicamente una serie de clases cuyos objectos
sirven para rellenar de una u otra manera los grficos. Podemos tener brochas
que se encarguen de definir el fondo de un elemento o el trazo de su borde.
Gua prctica de desarrollo de aplicaciones Windows en .NET
Tipo ejemplo
<Rectangle Width="75"
Height="75">
Resultado
<Rectangle.Fill>
<SolidColorBrush
Color="Red" />
</Rectangle.Fill>
</Rectangle>
Tipo
Los objetos Drawing repiten muchas de las caractersticas que tienen otros
elementos, como por ejemplo determinados controles. Cundo, por tanto,
usar unos y otros? En general los objetos Drawing son elementos que
favorecen el rendimiento a costa de perder caractersticas de control, por
ejemplo control de foco, lgica de layout, etc.
Las shapes son rutinas de dibujo que representan formas simples o complejas.
Todas ellas derivan de la clase abstracta Shape, que define la propiedad Fill,
brocha de fondo y las popiedades stroke, que te permiten definir el patrn y la
brocha de borde.
Rectangle
Dibuja un rectngulo
<Rectangle Width="30"
Height="30" />
Ellipse
<Ellipse Width="30"
Height="30" />
Line
Polyline
<Polyline Points="10,10,1,1"
/>
Poligon
<Polygon
Points="10,10,1,1,30,15" />
Path
<Path Stroke="Black"
StrokeThickness="1"
Fill="#CCCCFF">
<Path.Data>
<GeometryGroup
FillRule="EvenOdd">
<LineGeometry
StartPoint="10,10"
EndPoint="50,30" />
<EllipseGeometry
Center="40,70"
RadiusX="30" RadiusY="30"
/>
<RectangleGeometry
Rect="30,55 100 30" />
</GeometryGroup>
</Path.Data>
</Path>
Descripcin
RotateTransform
ScaleTransform
SkewTransform
TranslateTransform
XAML
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1" >
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
Renderizado 3-D
WPF nos permite crear funcionalidad 3D. Esta funcionalidad est dirigida a
crear entornos ms ricos, complejas representaciones de los datos o mejorar la
experiencia de usuario, no para crear aplicaciones de alto rendimiento, como
por ejemplo juegos.
Los grficos 3D se encapsulan en un elemento llamado Viewport3D. Este
elemento es tratado como un elemento visual 2D que es una ventana al mundo
3D.
En el sistema bidimensional el origen se encuentra en el punto superior
izquierdo del contenedor, sin embargo en el 3D en el centro del rea. La
coordenada X crecer hacia la derecha y decrecer hacia la izquierda, la Y
positiva hacia arriba y negativa hacia abajo y la Z positiva desde el centro hacia
el observador.
Este espacio se define como un marco de referencia para los objetos (espacio
mundo), en el se pueden depositar cmaras, luces u objetos, esto ltimos
Gua prctica de desarrollo de aplicaciones Windows en .NET
>
Los objetos para ser visibles necesitan materiales adems de estar iluminados.
Los modelos para ello pueden aplicar un descendiente de la clase abstracta
Material, cada una de las cuales provee de un aspecto concreto en funcin del
material adems de proveer una propiedad para especificar una brocha:
DiffuseMaterial especifica que el material se aplica iluminado difusamente, no
refleja la luz.
SpecularMaterial en este caso el material refleja la luz.
EmissiveMaterial, este tipo de material emite luz del coincidente con la
textura.
Las escenas tambin han de ser iluminadas, para ello contamos con diferentes
tipos de luces.
AmbientLight: Luz ambiente que ilumina todos los objetos por igual.
DirectionalLight: Iluminan como una fuente distante, con direccin pero no
localizacin.
PointLight: Iluminan como un origen cercano, tiene posicin pero no
direccin, y un rango fuera del cual ya no ilumina.
SpotLight: Hereda de PointLight disponiendo de posicin y direccin.
XAML
<ModelVisual3D.Content>
<AmbientLight Color="#333333" />
</ModelVisual3D.Content>
Animacin
Las animaciones son pequeos algoritmos que en un espacio de tiempo
transitan desde un valor a otro cuyo tipo depender del tipo de la animacin.
As una animacin numrica puede transitar entre 1 y 2 en un segundo.
La utilidad de una animacin es que se puede conectar con una propiedad de
un objecto, cuyo tipo sea compatible y de manera automtica esta se ver
modificada transitando entre los valores de la animacin en el tiempo
especificado.
Un StoryBoard es una agrupacin de animaciones que permite crear efectos
complejos por la suma de estas. Adems el StoryBoard crea unas propiedades
attached que nos permiten vincular las animaciones con los diferentes
elementos y sus correspondientes propiedades.
XAML
<Storyboard>
<DoubleAnimation From="0" To="5"
Duration="00:00:00.5" Storyboard.TargetName="effect"
Storyboard.TargetProperty="ShadowDepth" />
</Storyboard>
En el ejemplo podemos ver como una animacin que dura apenas mdio
segundo y que transita entre 0 y 5 se aplica a la propiedad ShadowDepth
perteneciente a un elemento llamado effect, que es un ShadowEffect.
Existen decenas de tipos de animaciones e incluso varias versiones de una
misma animacin. Double, Single, Point, Point3D, String, etc.. son tipos que
soportan animaciones, en algunos casos slo del tipo UsingKeyFrames.
Estas animaciones se diferencian de las normales en que contienen una serie
de KeyFrames, valores intermedios, que nos permiten establecer puntos de
inicio y final intermedios. Con ellos logramos cosas como transiciones no
lneales o incluso y segn el caso mejoras de rendimiento.
La clase StoryBoard tiene una serie de mtodos que desde programa nos
permite ejecutarla, pararla, cancelarla, etc. Pero lo mejor de los StoryBoard es
que existen una serie acciones de trigger que nos permiten hacer lo mismo.
Si recordamos cuando hablbamos de los trigger mencionbamos uno en
especial, EventTrigger que nos permite enlazar con las siguientes acciones:
Accin de Trigger
Efecto
BeginStoryBoard
Arranca un Storyboard
ResumeStoryBoard
PauseStoryBoard
Para un Storyboard
Esto es sumamente til porque nos permite crear StoryBoards sin necesidad
de incluir cdigo en nuestra aplicacin. Esto produce que los diseadores y
programadores puedan trabajar conjuntamente de una manera simultnea, a
tiempo que se reduce la complejidad del cdigo.
XAML
<Button x:Name="button2" Width="100" Height="30"
Content="Pulsame">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation From="1" To="0"
Storyboard.TargetName="button2"
Storyboard.TargetProperty="Opacity" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
En todo caso utilizar el Visual State Manager es tan sencillo como anidar un
nodo VisualStateManager.VisualStateGroup, dentro de este definir un
VisualStateGroup que puede acoger diferentes estados en nodos VisualState, a
los cuales se les otorga un nombre y que bsicamente acogen un StoryBoard
que se ejecutar cuando le comuniquemos al Visual State Manager que
queremos que el objeto transite a un determinado estado.
XAML
<Button Width="100" Height="30" Name="Button1"
Content="Pulsame">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState Name="normal">
<Storyboard>
<DoubleAnimation BeginTime="00:00:00.5" From="1"
To="0" Duration="00:00:00.5"
Storyboard.TargetName="Trans"
Storyboard.TargetProperty="ScaleX" />
</Storyboard>
</VisualState>
<VisualState Name="sobre">
<Storyboard>
<DoubleAnimation BeginTime="00:00:00.5" From="0"
To="1" Duration="00:00:00.5"
Storyboard.TargetName="Trans"
Storyboard.TargetProperty="ScaleX" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Button.RenderTransform>
<ScaleTransform x:Name="Trans" />
</Button.RenderTransform>
</Button>
Tratamiento de medios
Como ya vimos en captulos anteriores existe un amplio soporte para medios
en WPF. Tenemos controles y otro tipo de elementos que nos permiten
reproducir desde imgenes estticas hasta vdeos o audio.
Las imgenes incluyen iconos, fondos e incluso partes de animaciones. El
trabajo bsicamente se realiza a travs de la clase Image que nos permite
introducir una imagen en marcado o hacer tratamiento no visual de ella.
Ejemplos de las capacidades de esta clase pueden ser:
1.
XAML
<Image Width="200" >
<Image.Source>
<FormatConvertedBitmap Source="imagen.jpg"
DestinationFormat="Gray4" />
</Image.Source>
</Image>
Conclusin
Casi todo en WPF est orientado a potenciar las capacidades grficas. Es este
sin duda el principal objetivo de esta tecnologa y el factor diferenciador. En el
captulo hemos intentado dar una idea general de lo que esta API permite
hacer en este campo.
A continuacin
El tratamiento documental es algo que habitualmente tiene mucha
importancia en las aplicaciones pero que solemos pasar desapercibido a la
hora de evaluar un API de programacin. Comnmente es debido a que suelen
ser servicios externos, generadores de informes y dems los que asumen esta
responsabilidad.
Sin embargo WPF incorpora un soporte documental que nos permite
ciertamente mucha flexibilidad, a continuacin veremos cmo.
Documentos
A diferencia de las versiones de Windows, WPF contiene un soporte para la
creacin, lectura y gestin de la seguridad de documentos de alta calidad, as
como las clases necesarias para su tratamiento.
Documentos en WPF
WPF soporta dos tipos de documentos, "flow documents" y "fixed documents".
Los primeros estn indicados para su uso en aquellas aplicaciones que
pretenden mostrar documentos agradables y adaptables para su lectura, los
segundos en cambio estn ms orientados para la creacin de aplicaciones que
busca precisin en la reproduccin de documentos, WYSIWYG o impresin.
WPF nos aporta una serie de controles que facilitan el uso y la muestra de
ambos tipos de documentos. En el caso de los documentos fijos disponemos
del control DocumentViewer y en el caso de los de flujo FlowDocumentReader,
FlowDocumentPageViewer y FlowDocumentScrollViewer.
El control DocumentViewer nos permite operaciones como impresin, copia,
zoom y bsqueda adems de soportar, como muchos otros controles WPF, la
aplicacin de un nuevo estilo completo o parcial que adapte el control al estilo
Documentos de flujo
Un documento de flujo esta diseado esencialmente para mejorar la
experiencia de lectura, para ello se ha de adaptar al espacio disponible, la
resolucin o preferencias del usuario.
Uso
Paragraph
Delimitador de prrafo.
Section
BlockUIContainer
List
Tabla
TableRow
TableCell
ListItem
Run
HyperLink
Bold
Estilo negrita.
Italic
Estilo cursiva.
Underline
Estilo subrayado.
InlineUIContainer
Floater
Figure
LineBreak
Salto de lnea.
Serializacin y almacenaje de
documentos
WPF es capaz de manejar un documento en memoria, pero una de las
caractersticas claves del manejo de documentos es tambin guardarlos y
cargarlos desde un soporte de almacenamiento. Esto es lo que llamamos
serializacin.
El proceso de cargar o guardar documentos ha de ser transparente a la
aplicacin, en general esta debe llamar a mtodos Read o Write de un
serializador, sin tener que pensar en el formato.
Adems las aplicaciones proveen habitualmente de mltiples formatos para
leer y escribir documentos. Esa es la razn principal por la cual la arquitectura
de serializadores documentales de WPF es modular.
Las caractersticas principales que los serializadores tienen o han de tener son:
Para ello y debido a la curiosa estructura de los archivos XPS hemos de crear
un paquete que junto con el plug-in nos permite crear el serializador. Por
ltimo serializamos el documento.
Anotaciones
Las anotaciones son notas o comentarios que se aaden a los documentos y
que nos permiten marcar informacin o resaltar puntos de inters.
Existe dos tipos de notas Sticky Notes y Highlights.
Las primeras contienen informacin en un papel que se "pega" al documento,
adems de cumplir con su funcin nos permiten mejorar la experiencia de
usuario en dispositivos como Tablet o Tablet PC.
C#
AnnotationService _annotService = new
AnnotationService(docViewer);
FileStream _annotStream = new FileStream(
_annotStorePath, FileMode.OpenOrCreate,
FileAccess.ReadWrite);
XmlStreamStore _annotStore = new
XmlStreamStore(_annotStream);
_annotService.Enable(_annotStore);
Visual Basic.NET
Dim _annotService As New AnnotationService(docViewer)
Dim _annotStream As New FileStream(_annotStorePath,
FileMode.OpenOrCreate, FileAccess.ReadWrite)
Dim _annotStore As New XmlStreamStore(_annotStream)
_annotService.Enable(_annotStore)
Conclusin
El tratamiento de documentos es tambin una de las caractersticas de WPF.
Se nos permite crear documentos adaptados a lectura o impresin, con
servicios que nos permiten partiendo de los primeros crear los segundos. Por
ltimo tenemos la capacidad de crear notas para comentar documentos ya
existentes.
Esto incrementa considerablemente las capacidades de los dispositivos
programados con WPF, ya que nos permite integrar un buen conjunto de
tecnologas que van desde los e-Books al tratamiento documental avanzado.
A continuacin
Otra de las caractersticas de cualquier plataforma de desarrollo es la
extensibilidad. En WPF podemos extender la plataforma de muchas maneras
pero la ms comn es la de crear nuevos controles. En el siguiente captulo
veremos cmo.
Controles
Siguiendo un modelo que no es nuevo, en WPF, podemos optar por dos
caminos diferentes a la hora de crear controles. De un lado se encuentran los
controles de usuario, fciles de desarrollar pero con un nivel de
encapsulamiento pequeo o los controles personalizados, ms complicados
pero mejor resueltos a nivel de interfaz de programacin.
Sin embargo a diferencia de otros mecanismos de programacin no es tan
frecuente el desarrollo de nuevos controles, ya que WPF proporciona mltiples
mecanismos para personalizar controles.
Controles de usuario
Los controles de usuario son una seria opcin antes de introducirse en el
farragoso mundo de la creacin de controles personalizados.
Y lo son porque la complejidad de desarrollo es relativamente baja, pudiendo
por otro lado insertarlos en una librera sin mayores problemas e insertarlos
en aquellas aplicaciones que necesitemos.
394 | Window
ws Presentattion Found
dation
Paraa crear un co
ontrol de usu
uario lo nicco que debem
mos hacer es agregarlo a
nuesstro proyecto, y obtendrremos un disseador muy similar a una
u ventanaa,
slo que en estee disearemo
os un controol en vez de toda
t
una ven
ntana.
XAML
L
ontrol x:C
Class="Use
erControl1
1"
<UserCo
xmlns="
"http://sc
chemas.mic
crosoft.co
om/winfx/2
2006/xaml/
/pr
esentat
tion"
xmlns:x
x="http://
/schemas.m
microsoft.
.com/winfx
x/2006/xam
ml"
xmlns:m
mc="http:/
//schemas.
.openxmlfo
ormats.org
g/markupcompatibility/20
006"
xmlns:d
d="http://
/schemas.m
microsoft.
.com/expre
ession/ble
end
/2008"
m
mc:Ignorab
ble="d"
d
d:DesignHe
eight="300
0" d:Desig
gnWidth="3
300">
<Grid>
</Grid>
>
</UserC
Control>
La
a jerarqua
a de
ob
bjetos
s en WPF
W
Bien,, si a pesar de
d todas las opciones
o
paara
no haacerlo seguim
mos pensan
ndo que
desarrrollar un nu
uevo controll es el camin
no a
tomaar, entonces debemos co
onocer la
jerarq
qua de objeetos bsica de
d WPF ya q
que
afinaaremos ms a la hora de desarrollar el
nuevvo control, evvitando funccionalidad
inneccesaria o inccluyendo fun
ncionalidad
requeerida que, de otra forma
a, deberamoos
impleementar.
Todo
os los objetoss descienden
n de una missma
clasee que implem
menta las fun
ncionalidadees
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Eventos, eventos enrutados que nos permiten relacionarnos con los dems
elementos del interfaz.
Sin embargo los mtodos son parte importante en todas las clases, en los
controles WPF slo sirven como apoyo, ya que estos como hemos podido
comprobar a lo largo del libro no se usan salvo a la manera tradicional, desde
cdigo.
C#
public class Comentario : ContentControl
{
static Comentario()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Coment
ario), new
FrameworkPropertyMetadata(typeof(Comentario)));
CommandManager.RegisterClassCommandBinding(typeof(Come
ntario), new CommandBinding(_ocultar, ocultando));
CommandManager.RegisterClassInputBinding(typeof(Coment
ario), new InputBinding(_ocultar, new
MouseGesture(MouseAction.LeftClick)));
}
public Brush ComentarioBackground
{
get { return
(Brush)GetValue(ComentarioBackgroundProperty); }
set {
SetValue(ComentarioBackgroundProperty, value); }
}
public static readonly DependencyProperty
ComentarioBackgroundProperty =
DependencyProperty.Register("ComentarioBackground",
typeof(Brush), typeof(Comentario), new
UIPropertyMetadata(Brushes.Aqua));
static RoutedCommand _ocultar = new
RoutedCommand();
static private void ocultando(object sender,
ExecutedRoutedEventArgs e)
{
Comentario obj = (Comentario)sender;
object sb =
(obj.Template.FindName("panel", obj) as
Grid).Resources["Ocultar"];
(sb as Storyboard).Begin();
}
}
Visual Basic.NET
Public Class Comentario
Inherits ContentControl
Shared Sub New()
Gua prctica de desarrollo de aplicaciones Windows en .NET
En el ejemplo anterior vemos como hemos creado una clase que deriva de
Content control con una propiedad dependiente que nos servir para
establecer la brocha a aplicar al control.
Tambin tenemos un comando que lanza una StoryBoard. Pero dnde est
definida esta StoryBoard?
La respuesta es sencilla cuando creamos un control personalizado
automticamente Visual Studio crea una carpeta dentro del proyecto llamada
Themes, en ella se introduce un archivo Generic.xaml.
Gua prctica de desarrollo de aplicaciones Windows en .NET
Este archivo almacena la plantilla y el estilo del control y en ella como se puede
ver hemos definido la StoryBoard:
XAML
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr
esentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ComentarioLib">
<Style TargetType="{x:Type local:Comentario}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type
local:Comentario}">
<Grid x:Name="panel">
<Grid.Resources>
<Storyboard
x:Key="Ocultar">
<DoubleAnimation
From="1" To="0" Duration="00:00:02"
Storyboard.TargetName="panel"
Storyboard.TargetProperty="Opacity" />
</Storyboard>
</Grid.Resources>
<Border
Background="{TemplateBinding ComentarioBackground}"
CornerRadius="24"
BorderBrush="Black"
Margin="0,0,0,30" Padding="24"
BorderThickness="2">
<ContentPresenter />
</Border>
<Grid
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Margin="0,0,30,0">
<Polygon
Points="10,0,40,0,0,30" Fill="{TemplateBinding
ComentarioBackground}"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
/>
<Line X1="10" Y1="0"
X2="0" Y2="30" Stroke="Black" StrokeThickness="2"/>
<Line X1="10" Y1="0"
X2="40" Y2="0" Stroke="{TemplateBinding
ComentarioBackground}" StrokeThickness="3"/>
<Line X1="40" Y1="0"
X2="0" Y2="30" Stroke="Black" StrokeThickness="2"/>
</Grid>
</Grid>
Gua prctica de desarrollo de aplicaciones Windows en .NET
Conclusin
Aunque la extensibilidad es uno de los captulos ms importantes en cualquier
API de desarrollo. En WPF, sin embargo, esta extensibilidad pasa a un
segundo nivel ya que tenemos mecanismos para crear nuevos controles ms
sencillos de lo habitual. An as existen mecanismos para crear controles con
los que encapsular funcionalidades que de manera reiterada, queremos usar en
nuestros proyectos.
A continuacin
En el mundo tan globalizado en que vivimos las aplicaciones necesitan
competir en un mercado cada vez ms abierto y para ello que una aplicacin
funcione con independencia del pas, el idioma o las configuraciones
regionales de dramtica importancia.
De esto se encarga la globalizacin y la internacionalizacin, en el siguiente
captulo veremos como llevar a cabo estas actividades en WPF.
Localizacin e
InterOperabilidad
En este captulo trataremos dos temas que si bien no son parte del ncleo
principal de servicios de aplicacin en WPF, si que pueden tener una
importancia capital en segn que aplicaciones. La internacionalizacin de
aplicaciones y la interoperabilidad con Windows Forms.
Cuando limitamos nuestra aplicacin a un slo idioma estamos limitando su
mercado a una pequea porcin de los consumidores potenciales, al tiempo
que competimos en inferioridad de condiciones con nuestros competidores.
Este proceso no slo involucra el soporte de ms de un idioma, sino en
ocasiones tambin el diseo de la aplicacin, los formatos y hasta los alfabetos
se ven afectados.
De la traduccin se ocupa la localizacin y del resto la globalizacin.
Localizacin y Globalizacin
Existen una serie de prcticas, que son comunes a todas las aplicaciones en
.NET para globalizar y que por lo tanto no vamos a tratar aqu. Sin embargo
existen algunas recomendaciones que en forma de buenas prcticas s
trataremos.
Trate de no crear en cdigo los interfaces, de esta manera quedarn expuestos
a las API de internacionalizacin.
Evite las posiciones absolutas y los tamaos fijos.
Utilice el panel Grid y su posicionamiento y dimensionamiento en vez del
Canvas.
Aprovisione de espacio extra en los textos, porque el texto localizado suele ser
de diferente tamao.
Utilice el TextWrapping.
Establezca el atributo xml:lang all donde pueda, ya que es el atributo que
establece el lenguaje.
Cuando se creen aplicaciones de navegacin establecer la propiedad
FlowDirection en el texto, a fin de que esta no se herede del navegador y pueda
funcionar mal en un entorno idiomtico diferente al esperado.
XAML tambin con diversas codificaciones, en concreto ASCII, UTF-16 y UTF8, la especificacin de cada una de ellas se realiza conforme al procedimiento
XML, o sea;
XAML
<?xml encoding="UTF-8"?>
404 | Window
ws Presenta
ation Found
dation
Al igu
ual que el reesto de las ap
plicaciones ..NET, las ap
plicaciones WPF
W son
capacces de soporrtar ensamblados localizzados. Estoss ensamblad
dos son
bsiccamente de recursos
r
que
e se compilaan a partir dee un ensamb
blado normaal.
Esto quiere decirr que cuando
o tenemos u
un ensambla
ado y lo compilamos con
n un
idiom
ma distinto al
a neutral un
n ensamblad
do de recurso
os se genera
a en un
subd
directorio con
n el nombre
e de la culturra selecciona
ada. Para conseguir estoo
hemo
os de incluirr en el archiv
vo de proyeccto .csproj o .vbproj la siiguiente lneea
dentrro del grupo
o de propiedades corresp
pondiente a la plataform
ma y
confiiguracin selleccionadas para la com
mpilacin:
XML
<UICult
ture>en-US
S</UICultu
ure>
Qued
dando el pro
oyecto de la siguiente
s
maanera:
XML
<Prop
pertyGroup
p Conditio
on="
'$(Conf
figuration
n)|$(Platf
form)' == 'Debug|x8
86' ">
<PlatformTar
rget>x86</
/PlatformT
Target>
<De
ebugSymbol
ls>true</D
DebugSymbo
ols>
<De
ebugType>f
full</Debu
ugType>
<Op
ptimize>fa
alse</Opti
imize>
<Ou
utputPath>
>bin\Debug
g\</Output
tPath>
<De
efineConst
tants>DEBU
UG;TRACE</
/DefineCon
nstants>
<Er
rrorReport
t>prompt</
/ErrorRepo
ort>
<Wa
arningLeve
el>4</Warn
ningLevel>
>
<UI
ICulture>e
en-US</UIC
Culture>
</Pro
opertyGrou
up>
Al ejeecutar la com
mpilacin ell siguiente di
directorio se crear:
o se puede ver
v en la ima
agen un nuevvo ensambla
ado con el mismo
m
nombbre
Como
que la aplicacin
n pero con la
a extensin R
Resources.dlll se crea.
Bsicamentee contiene lo
os recursos d
de la
Pero,, qu contieene este ensamblado?. B
propiia aplicacin
n etiquetado
os como paraa ser cargad
dos cuando la
a aplicacin
n se
encueentre en un entorno coincidente con
n el de la cu
ultura.
Gua
a prctica de
d desarrolllo de aplica
aciones Wiindows en .NET
.
Windo
ows Presenttation Foun
ndation | 405
ar accesible
e a travs dee la clase Ressources denttro del espaccio
Este recurso esta
de no
ombre Propeerties. En ell evento Loaad podemos asignar los diferentes
d
texto
os utilizando
o un cdigo similar
s
a estee:
C#
label1.Content =
WpfApplication2.
.Propertie
es.Resourc
ces.String
g1;
ual Basic.NET
Visu
label1.Content =
WpfApplication2.
.Propertie
es.Resourc
ces.String
g1
Gua prctica de
e desarrolllo de aplica
aciones Win
ndows en .N
NET
Interoperabilidad
Bajo el nombre de interoperabilidad se esconde el camino para hacer
trabajar una o ms tecnologas en principio exclusivas, como podra ser el
caso de WPF y Windows Forms.
No slo Windows Forms sino Directx o la API Win32, pueden ser objeto de
interoperabilidad con WPF, si bien al ser este un libro escrito sobre la
tecnologa .NET poco sentido tendra abordar semejantes interoperabilidades.
Una vez centrado el objeto de nuestro inters diremos que abordar la
interoperabilidad entre WPF y WinForms es tanto como abordar como
integrar WPF en aplicaciones WinForms y viceversa.
El control WindowsFormsHost nos permite la interoperabilidad con Windows
Forms desde WPF. Los siguientes escenarios de interoperacin se soportan
cuando una aplicacin WPF ha de alojar un control Windows Forms:
Conclusin
Con WPF podemos crear fcilmente aplicaciones internacionales que nos
permitan llegar a, cuantos ms mercados mejor. Este soporte es plenamente
compatible con el soporte general de .NET.
Adems prevee mecanismos para que la integracin con las tecnologas
circundantes, lase Windows Forms, API Win32 o DirectX puedan utilizarse
de la manera ms efectiva posible.