Microsoft e Intel anuncian Silverlight para Moblin

septiembre 26, 2009 11:34 by EugenioEstrada

Microsoft e Intel acaban de anunciar el desarrollo de una implementación especifica de Silverlight para el S.O. basado en Linux de Intel, Moblin. Dicho sistema operativo tiene un repositorio de aplicaciones similar al del iPhone, donde sería distribuída dicho paquete.

Ha llamado especialmente la atención este anuncio ya que ya existe una implementación de Silverlight para Linux, Moonlight, tras el amparo de Novell. Pero Microsoft e Intel han justificado una nueva implementación en que mientras que Novell, con Moonlight, su target son S.O. de escritorio. Microsoft seguirá desarrollando implementaciones especificas, como puede ser la de Moblin, la de Nokia, etc. Ya que está sería con la ayuda de Intel para conseguir una mejor experiencia en equipos basados en Atom.

Para más información:

Programa de desarrollo de Intel Atom: http://appdeveloper.intel.com/en-us/
Moblin: http://moblin.org/
Moonlight: http://www.mono-project.com/Moonlight
Noticia: http://www.theregister.co.uk/2009/09/24/silverlight_to_linux/


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Nos certificamos

septiembre 25, 2009 10:59 by eugenioestrada

En los últimos meses hemos estado trabajando duramente para aumentar nuestro número de certificaciones oficiales.

Para ello nos hemos centrado en dos aspectos muy importantes, la certificación de la empresa como Microsoft Certified Partner y nuestros compañeros como Microsoft Certified Technical Specialist.

Dentro del programa Microsoft Certified Professional, hemos obtenido certificaciones que nos acreditan como expertos en ciertas áreas de especialización. Actualmente contamos con 6 compañeros certificados. Y en total contamos con las siguientes áreas de especialización:

  • MCTS: Windows Server 2008 Applications Infrastructure Configuration
  • MCTS: Windows Server 2008 Network Infrastructure Configuration
  • MCTS: .NET Framework 3.5: Windows Presentation Foundation
  • MCTS: .NET Framework 3.5: Windows Communication Foundation
  • MCTS: .NET Framework 3.5: Windows Forms Application Development
  • MCTS: .NET Framework 3.5: ADO.NET Application Development

En el programa Microsoft Partners hemos obtenido la competencia de Business Process and Integration Solutions.

Microsoft Certified Partner

Además también nos hemos certificado como Silverlight Partners. Para poder proveer soluciones Silverlight oficialmente.

image


Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

[Sharepoint] Sucesos 6398 & 6872, Incoming email

septiembre 14, 2009 11:47 by AlbertoFojo

Tras mover el Web Application de Sharepoint de un Windows 2003 x86 a un Windows 2008 R2 x62 (tenéis un manual aquí), parecía que todo había ido bien. Los servicios funcionaban y los documentos se podían subir/bajar sin ningún problema.

Sin embargo, tras unos instantes de celebrar el éxito con licor café, tarta de Santiago y guirnaldas, pudimos ver que el servicio de Incoming email no estaba del todo bien configurado, aquí tenéis los errores:

Event Type: Error
Event Source: Windows SharePoint Services 3
Event Category: Timer
Event ID: 6398
Date: 12/09/2009
Time: 11:21:40 AM
User: N/A
Computer:
Description:
The Execute method of job definition Microsoft.SharePoint.Administration.SPIncomingEmailJobDefinition (ID ea68de6c-9172-4d55-bf5f-7781e9a885de) threw an exception. More information is included below.
Value cannot be null.
Parameter name: path
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Event Type: Error
Event Source: Windows SharePoint Services 3
Event Category: E-Mail
Event ID: 6872
Date: 12/09/2009
Time: 11:21:40 AM
User: N/A
Computer:
Description:
A critical error occurred while processing the incoming e-mail drop folder . The error was: Value cannot be null.
Parameter name: path.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

 

Lo primero, fue ver las configuraciones del Incoming email en Central Administration > Operations > Incoming E-Mail Settings.

Ahí podemos ver las configuraciones avanzadas si checkeamos Advanced. Esto nos dejará ver el Email Drop Folder, que por defecto nos dirá que es c:\inetpub\mailroot\drop. Si esto está bien lo dejaremos así. Si tenéis almacenado el sitio de Sharepoint en otra unidad, tendréis que cambiarlo (p.e.: e:\inetbut\mail…).

Una vez hecho esto, habrá que darle full control en esta carpeta a los siguientes usuarios:

WSS_ADMIN_WPG
WSS_WPG

Y el error ya no se reproduce más ;)


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Problemas y soluciones: Entity Framework, vistas y claves

junio 8, 2009 17:30 by eugenioestrada

Uno de los grandes problemas que me he encontrado a la hora de trabajar con Entity Framework (EF) es la de mapear una vista.

¿Dónde está el problema?

El problema está que una entidad de EF debe tener una clave primaria y las vistas no tienen claves primarias.

image

En una vista como la anterior realmente no tenemos una clave definida en la base de datos ya que los datos filtrados por Entidad generaría una gráfica como la siguiente:

image

Por defecto EF infiere que Entidad es una clave, lo infiere a partir de aquellos campos que SQL Server dice que no pueden ser nulos. En principio no da ningún problema, pero tenemos dos casos en los que ya encontramos conflictos.

  1. Obtenemos más de un resultado con Entidad idéntica. Al rellenar los objetos EF, presupone que al tener la misma clave primaria son el mismo objeto por lo que siempre tendríamos el primer objeto creado.
  2. Si filtramos por Entidad exclusivamente, EF presupone que solo vendrá un resultado por lo tanto se produce una excepción.

Hasta aquí bien, la solución podría ser quitar esa clave, EF no nos deja:

“Toda entidad tiene que tener una clave primaria”

¿Solución?

Para ello debemos de crear una clave artificial, el rowcount de nuestra vista puede ser una opción, ya que todas las claves deben ser distintas. Pero como aun así nuestro Entity Framework no lo detecta como clave debemos emergernos en el EDMX y modificar el XML a mano.

Para ello cabe destacar que el fichero XML tiene un elemento llamado <edmx:Runtime> que es el que a nosotros nos interesa y que éste consta de tres partes:

  1. SSDL: StorageModels: El modelo importado de la base de datos
  2. CSDL: ConceptualModels: El modelo generado a partir del importado y el que representará cada una de las entidades que luego usaremos por código
  3. C-S: Mappings: Es la que une ambos modelos

Nosotros primero debemos modificar el SSDL, el siguiente es el :

<EntityType Name="vXXXX">
  <Key
    <PropertyRef Name="Entidad" /> 
  </Key
  <Property Name="IDPK" Type="bigint" /> 
  <Property Name="Entidad" Type="int" Nullable="false" /> 
  <Property Name="FechaPrevista" Type="datetime" /> 
  <Property Name="Sobres" Type="int" />
</EntityType>

Este sería el modelo importado tal cual lo importó el diseñador. Como veis hemos creado el campo IDPK con el rowcount para establecerlo como clave. Para poder hacerlo se debe de hacer lo siguiente:

 

<EntityType Name="vXXXX"
  <Key
    <PropertyRef Name="IDPK" /> 
  </Key
  <Property Name="IDPK" Type="bigint" Nullable="false" /> 
  <Property Name="Entidad" Type="int" /> 
  <Property Name="FechaPrevista" Type="datetime" />
  <Property Name="Sobres" Type="int" />
</EntityType>

Entonces en el modelo de la base de datos ya tenemos IDPK como clave. Ahora solo nos queda cambiarlo en el diseñador. Y para ello debemos hacer click derecho en el campo y establecerlo como clave:

image 

Y así ya podremos trabajar normalmente con nuestra entidad.

Problemas posteriores

Problemas tendremos después cuando actualicemos el modelo desde la base de datos, porque el SSDL se modificará y tendremos que hacer a mano los cambios que ahora hemos hecho. En cambio en el diseñador no tendremos que hacer nada.


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Silverlight: Como cambiar el titulo de la pagina

mayo 25, 2009 16:56 by eugenioestrada

En los foros de Silverlight preguntaban como enlazar el título de una página a un control. El problema está en que Silverlight por defecto no tiene una propiedad que nos permita acceder directamente al título de la página. Esto es debido a que Silverlight no está concebido para una relación uno a uno (HTML-Silverlight) sino como una forma de complementar la página HTML. Pero en cambio si que propone un sistema de interacción entre ambos mundos.

Por lo tanto, para poder abordar dicho problema crearé una clase llamada PageUtil:

using System.Windows.Browser;

public class PageUtil
{
    public static string PageTitle
    {
        get
        {
            var result = "";
            var elements =
                HtmlPage.Document.GetElementsByTagName("Title");
            if (elements != null && elements.Count > 0)
            {
                var titleElement = (HtmlElement)elements[0];
                result = (string)titleElement.GetProperty("innerHTML");
            }
            return result;
        }
        set
        {
            HtmlPage.Document.SetProperty("title", value);
        }
    }
}

Una vez que ya tenemos la clase creada debemos crear el recurso, ya sea a nivel local en el UserControl o a nivel de aplicación (para una clase tan genérica yo recomiendo que sea a nivel de aplicación).

<MyProject:PageUtil x:Key="PageUtilDataSource" /> 

Y luego solamente tenemos que enlazar la propiedad al control queramos:

<TextBox DataContext="{Binding Source={StaticResource PageUtilDataSource}}"
         Text="{Binding Path=PageTitle, Mode=TwoWay}"
         Height="30"
         VerticalAlignment="Top" />

Recuerdo que a mayores de hacer el enlace (en nuestro caso en la propiedad Text) debemos establecerle el DataContext con el recurso.

Como siempre espero que os sea útil.

Follow me! http://twitter.com/eugenioestrada


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Silverlight: El sistema de ficheros y configuraciones

mayo 22, 2009 00:26 by eugenioestrada

Una de las grandes limitaciones que tiene Silverlight es el acceso a disco, esto es debido a su ejecución aislada dentro del navegador. Habréis leído que Silverlight 3 tendrá capacidades de ejecución offline y out-of-browser, el resultado será el mismo ya que funcionaría igual que si siguiera alojada en el navegador.

Por muchos motivos podemos querer persistir en local algunos datos que hemos generado o que nos hemos traído del servidor.

Para ello Silverlight nos propone el Isolated Storage (almacenamiento aislado) donde podemos guardar ficheros y crear una jerarquía de carpetas. Antes de seguir quería comentar donde se encuentran estos directorios en la máquina:

  • Windows Vista/7: C:\Users\<Usuario>\AppData\LocalLow\Microsoft\Silverlight\is
  • Windows XP: C:\Documents and Settings\<Usuario>\Local Settings\Application Data\Microsoft\Silverlight\is
  • Mac OS X: /Users/<Usuario>/Library/Application Support/Microsoft/Silverlight/is

Dentro de esas carpetas lo organiza por grupos, definiendo un grupo por dominio (definiendo dominio como nombre de dominio, puerto y protocolo). De tal forma que los siguientes serían grupos diferentes:

En cambio los siguientes serían el mismo grupo:

La importancia de conocer estos grupos es que a cada grupo el Isolated Storage le va a asignar una cuota de espacio en disco. Por defecto esta cuota está establecida en 1.0 MB ya que para pequeñas configuraciones y un uso “standard” del Isolated Storage sería suficiente. Pero aún así, previo ser aceptado por el usuario esta se puede aumentar a voluntad del programador.

Pero ya ha llegado el momento de usarla. Principalmente tenemos dos clases con las que debemos jugar IsolatedStorageFile y IsolatedStorageSettings. La primera es para todo lo que he dicho hasta ahora acceso a disco, ficheros, carpetas, etc. IsolatedStorageSettings, en cambio, nos sirve para guardar objetos binarios.

El funcionamiento de ambas es muy sencillo, lo vamos a ver mejor con un ejemplo:

var store = 
IsolatedStorageFile.GetUserStoreForApplication(); using (var stream = store.CreateFile("Fichero.txt")) using (var writer = new StreamWriter(stream)) { writer.WriteLine("1"); writer.WriteLine("2"); }

Con la función IsolatedStorageFile.GetUserStoreForSite() podríamos obtener el Store del grupo o sitio. Y tras ejecutar el código, ahí tenemos el fichero:

image 

El store tiene muchos métodos a mayores, para comprobar si existe un fichero, ver y modificar la cuota, leer ficheros, crear directorios, etc.

En cambio con el IsolatedStorageSettings es mucho más simple:

IsolatedStorageSettings.ApplicationSettings["Fondo"] =
Colors.Blue;

También tenemos el SiteSettings donde podremos cambiar todas las propiedades a nivel de sitio.

Silverlight es bastante potente a nivel de sistema de ficheros, está limitado a su vez por la isla en la que encuentra,pero que debido a la anatomía de las aplicaciones Silverlight no debería de ser eso un problema.

Los comentarios son bienvenidos ;-)

Follow me! http://twitter.com/eugenioestrada


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Nuevos autores en el lusco blog

mayo 21, 2009 19:22 by LuscoTekhne

Desde el mes de abril el nivel de actividad del blog ha aumentado considerablemente, eso es debido a que tenemos tres nuevos autores en el blog, cada uno centrado en una de nuestras categorías.

  • Marcos Sánchez: Centrado en WPF escribe sobre los aspectos avanzados de la programación con la revolucionaria tecnología Windows Presentation Foundation.
  • Alberto Basalo: Ha empezado a escribir sobre WCF y Data Services.
  • Alberto Fojo: Ha inaugurado la categoría de sistemas donde nos seguirá asombrando con sus artículos.

Seguiremos informando desde el lusco blog.

http://www.lusco.eu/blog


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Instalación de Windows 7 en un disco virtual

mayo 21, 2009 19:08 by albertofojo

Con Windows 7 hay una gran posibilidad que antes no teníamos: el arranque de archivos VHD (a.k.a. virtual disks). La posibilidad de instalar nuevo sistema operativo (funciona con Windows 7 y Windows 2008 R2), sin matar la instalación original es poco menos que una pasada. A diferencia de instalarlo en Virtual PC / Server o Hyper-V, este sistema operativo está trabajando sobre el hierro directamente :)

Todos los drivers están accesibles. Es igual que un arranque dual, pero sin la molestia de hacer particiones en el disco. Para más detalles sobre exactamente cómo funciona, puedes echar un vistazo a Mark Russinovich's TechEd lecture sobre dicha función.

Como sucede con gran parte de funciones beta, hace falta un poco de línea de comandos para que esto funcione. He encontrado un montón de guías en Internet, pero ninguna de ellos me funcionó y la mayoría de ellos incluyen jugar con Bcdedit y ya no es necesario (como cuando W7 estaba en beta 1). Parece que mucho de ellos fueron escritos antes de que Windows 7 fuese beta pública y nadie los ha actualizado. Voy a compartir lo que me funcionó, una forma rápida de hacer la instalación sin trámites innecesarios.


Arranque de la instalación

El primer paso es arrancar la instalación de Windows 7 (o Windows 2008 R2). En la instalación, hay que pulsar Shift+F10 para poder tener una consola de comandos.

Esa será nuestra herramienta de momento.


Creando el disco virtual
En este ejemplo, crearemos un VHD de 20GB, pero puedes seleccionar cualquier tamaño que quieras. 

Necesitamos usar la herramienta DISKPART:


X:\>DISKPART
DISKPART>
CREATE VDISK FILE="D:\Virtual Machines\Native\Windows7.vhd" MAXIMUM=20480 TYPE=FIXED
DiskPart successfully created the virtual disk file.

DISKPART>
SELECT VDISK FILE="D:\Virtual Machines\Native\Windows7.vhd"
DiskPart successfully opened the virtual disk file.
DISKPART>
ATTACH VDISK
DiskPart successfully attached the virtual disk file.
DISKPART>
EXIT
Leaving DiskPart...

Debido a algún extraña razón (o bug), crear un disco virtual (CREATE VDISK) con un path de más de 14 caracteres falla con el siguiente error: "The pathname for a virtual disk must be fully qualified". Una solución sería crear el archivo VHD en la raíz (y elegir un nombre corto) y moverlo a la ubicación deseada después. A los otros comandos no les importan los nombres largos ;) 

Mientras CREATE VDISK crea disco dinámico (se extiende, según sea necesario) por defecto, yo he usado discos fijos, ya que su rendimiento es un poco mejor y Windows 7 tiende a ampliar disco dinámico de todos modos a su máximo tamaño durante la instalación. Ten en cuenta que CREATE VDISK tarda bastante tiempo si crea un disco fijo, se paciente (o haz uno dinámico :D).

Se podría utilizar un archivo ya existente, pero hay algunos artículos que dicen que esto da problemas con archivos de  Virtual PC/Server. No lo puedo decir porque no lo probé por mi mismo. Intenté hacerlo con un archivo de disco virtual de Hyper-V y funcionó sin problemas.


Instalando

Después de añadir (ATTACH) el archivo de disco virtual podemos continuar con la instalación.
Como tipo de instalación, selecciona Personalizada y ahí podrás elegir el disco en el que quieres instalar el Sistema Operativo. Si todo ha ido bien, verás el disco creado anteriormente.
La instalación irá normalmente y después de unos cuantos reinicios, tu sistema estará listo para usarse

Visto en: http://medo64.blogspot.com


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tutorial: Usando el Visual State Manager

mayo 16, 2009 14:03 by EugenioEstrada

image

Tras varios meses trabajando con Silverlight uno empieza a tener buenas práctivas y ver como es más productivo. Por la forma de programar con Silverlight nos obliga a manipular el layout de nuestra aplicación constantemente. Para ello tenemos tres opciones: programáticamente desde C#, con StoryBoards o usando el Visual State Manager (VSM a partir de ahora).

Para nuestro tutorial vamos a crear un control llamado AnimatedImage con un UserControl normal con un Image dentro.

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="EugenioEstrada.AnimatedImage"
	Width="Auto" Height="Auto">
	<Grid x:Name="LayoutRoot">
		<Image x:Name="InternalImage">
		
		</Image>
	</Grid>
</UserControl>

Lo que queremos hacer con este control es sencillo, que al pasar el Mouse por encima de la imagen ésta se escale un 1,5. Y luego que al hacer Click (controlando el MouseDown y MouseUp del ratón) haga una animación. Para hacer las animaciones debemos definir los RenderTransform tanto del Grid como del Image:

<Grid x:Name="LayoutRoot" RenderTransformOrigin="0.5,0.5">
	<Grid.RenderTransform>
		<TransformGroup>
			<ScaleTransform/>
        		<RotateTransform/>
    			<SkewTransform/>
</TransformGroup> </Grid.RenderTransform> <Image x:Name="InternalImage" RenderTransformOrigin="0.5,0.5"> <Image.RenderTransform> <TransformGroup> <ScaleTransform/> </TransformGroup> </Image.RenderTransform> </Image> </Grid>

Sólo hemos definido el Scale, Rotate y Skew porque son los únicos que vamos a modificar luego. Y el RenderTransformOrigin define que el origen de las transformaciones será el punto central del elemento. Dentro del Grid vamos a definir el VSM y también debemos importar el namespace del VSM. Quedando así al final:

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:w="clr-namespace:System.Windows;assembly=System.Windows"
	x:Class="EugenioEstrada.AnimatedImage"
	Width="Auto" Height="Auto">
	<Grid x:Name="LayoutRoot" RenderTransformOrigin="0.5,0.5">
		<Grid.RenderTransform>
			<TransformGroup>
				<ScaleTransform/>
        			<RotateTransform/>
<SkewTransform/>
       </TransformGroup>
</Grid.RenderTransform>
        <w:VisualStateManager.VisualStateGroups>
<!-- A partir de ahora aquí -->
</w:VisualStateManager.VisualStateGroups>
        <Image x:Name="InternalImage" RenderTransformOrigin="0.5,0.5">
     <Image.RenderTransform>
        <TransformGroup>
        <ScaleTransform/>

        </TransformGroup>
        </Image.RenderTransform>
     </Image>
    </Grid>
</UserControl>

Ahora seguiremos dentro del VisualStateGroups, para hacernos una idea de como funciona el VSM  este define ciertos grupos de estados, por ejemplo para poder agrupar por estados que responden al mouse, estados comunes, etc. Sirve para agrupar estados de forma lógica reduciendo la combinatoria de éstos. Luego cada estado lo define un StoryBoard, que es el que establecerá el estado de la UI y luego se podrían definir transiciones entre estados para que no haya inconsistencias en el diseño. En nuestro caso solamente tendremos tresestados: Normal, MouseOver, MouseUp y todos los agruparemos en el VisualStateGroup que llamaremos CommonStates.

<w:VisualStateGroup x:Name="CommonStates">
	<w:VisualState x:Name="Normal"/>
	<w:VisualState x:Name="MouseOver"/>
	<w:VisualState x:Name="MouseUp"/>
</w:VisualStateGroup>

Para hacer esto recomiendo el uso de Microsoft Expression Blend (http://expression.microsoft.com) ya que es mucho más sencillo:

image

Empezaremos definiendo el estado Normal para verlo de ejemplo lo que hará es que desde un escalado del 150% pasará al 100% y esto se haría así:

<w:VisualState x:Name="Normal">
    <Storyboard>
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
            Storyboard.TargetName="InternalImage"
            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
            <EasingDoubleKeyFrame KeyTime="00:00:00" Value="1.5"/>
            <EasingDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
            Storyboard.TargetName="InternalImage"
            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
            <EasingDoubleKeyFrame KeyTime="00:00:00" Value="1.5"/>
            <EasingDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</w:VisualState>

 

Lo más complicado es el entender el TargetProperty que es el siguiente:

Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"

No es un acceso intuitivo (del estilo InternalImage.ScaleTransform.ScaleY) esto se debe a como funcionan las DependencyProperties de WPF/Silverlight que nos dará tema para otro artículo. Pero para hacer una vista muy rápida se debe a que las DependencyProperties son métodos estáticos que se encargan de hacer el get y el set mediante eventos. Esto nos permite luego usar todas capacidades de Data Binding que tiene tanto WPF como Silverlight. De una forma muy parecida vamos a crear los otros dos estados:

<w:VisualState x:Name="MouseOver">
	<Storyboard>
		<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="InternalImage"
			Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
			<EasingDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1.5"/>
		</DoubleAnimationUsingKeyFrames>
		<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="InternalImage"
			Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
			<EasingDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1.5"/>
		</DoubleAnimationUsingKeyFrames>
	</Storyboard>
</w:VisualState>
<w:VisualState x:Name="MouseUp">
	<Storyboard>
	    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="LayoutRoot"
			Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
			<EasingDoubleKeyFrame KeyTime="00:00:00.1000000" Value="30"/>
			<EasingDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-30"/>
			<EasingDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
		</DoubleAnimationUsingKeyFrames>
	</Storyboard>
</w:VisualState>

Ahora llega el momento de escribir un poco de C#. Debemos manejar los eventos MouseMove, MouseLeave y MouseLeftButtonUp del InternalImage:

<Image x:Name="InternalImage"
	RenderTransformOrigin="0.5,0.5"
MouseMove="InternalImage_MouseMove"
MouseLeftButtonUp="InternalImage_MouseLeftButtonUp"
MouseLeave="InternalImage_MouseLeave">

 

Y la clase AnimatedImage queda de la siguiente forma con los manejadores de eventos:

using System.Windows;
using System.Windows.Controls;

namespace EugenioEstrada
{
	public partial class AnimatedImage : UserControl
	{
		public AnimatedImage()
		{
			InitializeComponent();
			VisualStateManager.GoToState(this, "Normal", false);
		}

		private void InternalImage_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
		{
			VisualStateManager.GoToState(this, "MouseOver", false);
		}

		private void InternalImage_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
		{
			VisualStateManager.GoToState(this, "MouseUp", false);
		}

		private void InternalImage_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
		{
			VisualStateManager.GoToState(this, "Normal", false);
		}
	}
}

VisualStateManager es una clase estática y la firma de su método GoToState es la siguiente:

public static bool GoToState(Control control, string stateName, bool useTransitions);

El parámetro control es aquel objeto que queremos cambiarle el estado, el stateName es el nombre del estado al que queremos cambiar y el último parámetro, useTransitions, se usa para establecer si se usarán las transiciones de estado o no, en nuestro caso como no hemos definido ninguna lo establecemos en false.

Y finalmente el resultado es el siguiente:

Tras este artículo se nos abren varias opciones de publicación como Dependency Properties, Data Binding, etc.

 http://twitter.com/eugenioestrada (tweet me!)


Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Ejemplos avanzados de Binding

mayo 15, 2009 13:54 by marcossanchez

La extensión de marcado Binding en XAML es muy configurable, de forma que podemos usarlo de multitud de maneras para conseguir enlazar una propiedad de un control con cualquier otro elemento o propiedad que queramos. A continuación veremos algunos ejemplos:

Enlace entre controles:

      A) Directamente:

<Slider x:Name="slider" Minimum="0" Maximum="300" Value="50" />
<Rectangle Width="{Binding Path=Value, ElementName=slider}" Height="100" Fill="Red" />

 

     B) Buscando a través del árbol visual del elemento:

Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}"

Utilizando Converters:

Height="{Binding ElementName=txtCategoria1, Path=Text, Converter={StaticResource StringToHeight}} 

Con el Converter StringToHeight podemos convertir una cadena de caracteres en un entero que se aplicará a la propiedad Height del control. La regla de conversión la define el programador.

Enlace a un elemento de una colección:

<TextBlock Text="{Binding Path=Collection[index].PropertyName}"/>

 

Un ejemplo final que combina alguno de los anteriores. Se usa para asignar la propiedad Tooltip de un elemento (por ejemplo un TextBox) cuando la validación del elemento falla:

<Trigger Property="Validation.HasError" Value="True">
    <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Trigger>


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5