Es muy común que nos veamos en la necesidad de cambiar el tamaño de una imagen antes de, por ejemplo, subirla a la web. Para esto, hay muchos métodos que podemos utilizar, unos más sencillos o con más capacidades que otros.

Para aquellas veces que sólo ocupamos cambiar el tamaño de la imagen manteniendo sus proporciones, WPF nos facilita el trabajo con las propiedades DecodePixelWidth o DecodePixelHeight de la clase BitmapImage.

El siguiente método es todo lo que ocupamos para lograrlo:

 
        public static BitmapImage ResizeImage(BitmapImage image, int newSize)
        {
            BitmapImage i = new BitmapImage();
            i.BeginInit();
            i.UriSource = image.UriSource;
            i.DecodePixelWidth = newSize;
            i.EndInit();
            return i;
        }

De aquí es importante notar tres cosas:

Al método le pasamos una imagen y un nuevo tamaño. El nuevo tamaño se asigna a la propiedad DecodePixelWidth que será la nueva anchura de la imagen.

La altura de la imagen se deja sin asignar para que se ajuste automáticamente y la imagen mantenga sus proporciones.

El método regresa una nueva imagen con el tamaño deseado.

Con esta imagen podemos hacer lo que queramos, por ejemplo, con el siguiente código podemos guardarla en formato JPG en algún lugar de la pc:

 
        public static void SaveDecodeToJPG(string filename, BitmapImage image)
        {
            FileStream stream = new FileStream(filename, FileMode.Create);
            JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
            jpgEncoder.Frames.Add(BitmapFrame.Create(image));
            jpgEncoder.Save(stream);
            stream.Close();
        }

Baja un ejemplo de este código funcionando aquí.

Los textbox con watermark o “marca de agua” son un control muy común en casi cualquier sitio, y por alguna razón Silverlight 4 no viene ya con un control de este tipo, aunque el textbox si tiene una propiedad que se llama Watermark, no se puede usar…

Así que aquí les dejo un textbox con watermark que realizé para un proyecto (el cual pueden descargar al final del artículo o probarlo aquí), fué también mi primer Custom Control en Silverlight, así que cualquier comentario o correción son muy bienvenidos.

El código fuente es el siguiente, cómo se puede ver, el control cuenta con sólo dos propiedades, una para modificar el texto del watermark y otra para cambiar la fuente del watermark:


/// <summary>
    /// A TextBox control with a watermark
    /// </summary>

    [TemplatePart(Name = WatermarkedTextbox.watermarkTextBlock, Type = typeof(TextBlock))]
    public class WatermarkedTextbox : TextBox
    {

        #region Constants
        private const string watermarkTextBlock = "PART_Watermark";
        #endregion

        #region Properties

        public static readonly DependencyProperty Watermark_Property = DependencyProperty.Register("Watermark_", typeof(string), typeof(WatermarkedTextbox),
            new PropertyMetadata("watermark"));

        public static readonly DependencyProperty WatermarkFontFamilyProperty = DependencyProperty.Register(
            "WatermarkFontStyle", typeof(FontFamily), typeof(WatermarkedTextbox),
            new PropertyMetadata(new FontFamily("Segoe Print")));

        /// <summary>
        /// Gets or sets the text for the watermark
        /// </summary>
        [Category("Watermark")]
        [Description("Gets or sets the text for the watermark")]
        public string Watermark_
        {
            get { return (string)GetValue(Watermark_Property); }
            set { SetValue(Watermark_Property, value); }
        }

        /// <summary>
        /// Gets or sets the fontfamily for the watermark
        /// </summary>
        [Category("Watermark")]
        [Description("Gets or sets the text font for the watermark")]
        public FontFamily WatermarkFontFamily
        {
            get { return (FontFamily)GetValue(WatermarkFontFamilyProperty); }
            set { SetValue(WatermarkFontFamilyProperty, value); }
        }

        #endregion

        private Boolean watermarked;

        public WatermarkedTextbox()
        {
            DefaultStyleKey = typeof(WatermarkedTextbox);
            watermarked = true;
            this.GotFocus += new RoutedEventHandler(WatermarkedTextbox_GotFocus);
            this.LostFocus += new RoutedEventHandler(WatermarkedTextbox_LostFocus);
            this.IsEnabledChanged += new DependencyPropertyChangedEventHandler(WatermarkedTextbox_IsEnabledChanged);
            this.TextChanged += new TextChangedEventHandler(WatermarkedTextbox_TextChanged);
        }

        void WatermarkedTextbox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (watermarked)
                Unwatermark();
            if (this.Text == string.Empty)
                Watermark();
        }

        void WatermarkedTextbox_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (IsEnabled)
                GotoVisualState(WatermarkedTextboxVisualStates.Normal, true);
            else
                GotoVisualState(WatermarkedTextboxVisualStates.Disabled, true);
        }

        void WatermarkedTextbox_LostFocus(object sender, RoutedEventArgs e)
        {
            if (this.Text == string.Empty)
                Watermark();
        }

        void WatermarkedTextbox_GotFocus(object sender, RoutedEventArgs e)
        {
            if (this.Text == string.Empty)
                Unwatermark();
            else
                this.SelectAll();
        }

        private void GotoVisualState(WatermarkedTextboxVisualStates VisualState, bool useTransitions)
        {
            VisualStateManager.GoToState(this, VisualState.ToString(), useTransitions);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            if (this.Text != string.Empty)
                Unwatermark();
        }

        private void Watermark()
        {
            GotoVisualState(WatermarkedTextboxVisualStates.Watermarked, false);
            watermarked = true;
        }

        private void Unwatermark()
        {
            GotoVisualState(WatermarkedTextboxVisualStates.Unwatermarked, false);
            watermarked = false;
        }
    }
    public enum WatermarkedTextboxVisualStates { Normal, Disabled, Watermarked, Unwatermarked }

 

Descarga el control completo aquí o pruébalo aquí

image

Dreamspark ahora incluye el paquete para desarrollo de Aplicaciones de Windows Phone 7 Series. Si eres estudiante de cualquier nivel, ahora puedes obtener estar herramientas de manera gratuita y venderlas en Windows Marketplace dejando que Dreamspark se encargue de los gastos.

Las herramientas ofrecidas te permitirán:

Alcanzar una audiencia a nivel mundial:

Marketplace será preinstalado en cada dispositivo Windows Mobile 6.5, permitiendo llegar a un público bastante amplio

Utilizar las herramientas de siempre:

Usa los entornos de desarrollo de Microsoft como Visual Studio 2010 para el rápido desarrollo de tus aplicaciones

Administrar fácilmente tus aplicaciones:

Utiliza el portal web para desarrollades para registrar y subir tus aplicaciones, obtén soporte, presentación de informes y más.

Incrementar tus ingresos:

Construye tu carrera y gana dinero poniendote en contacto con millones de usuarios de Windows Mobile que quieres tus aplicaciones

Si no tienes una cuenta de Dreamspark y si tu escuela no cuenta con el servicio, ponte en contacto para resolver este problema.

!Ahora tienes las herramientas para generar los ingresos que le darán inicio a tu carrera!

image

Bing Maps Platform es una plataforma de Microsoft que permite desarrollar aplicaciones utilizando las funciones de Bing Maps. Se puede desarrollar para esta plataforma con AJAX o con Silverlight utilizando sus respectivos SDK’s. Cada uno tiene sus diferentes capacidades, aquí daremos el primer paso con el SDK de Silverlight desarrollando una pequeña aplicación que muestre al mapa del mundo en vista “Aerial” y las etiquetas de cada lugar del mapa.

El primer paso es ir al bingmapsportal y registrar una cuenta para que se te proporcione una credencial con la que puedas acceder al servicio.

Después de obtener la credencial, el paso que sigue es bajar e instalar el “Bing Maps Silverlight Control SDK” el cual puedes bajar desde aquí.

Ya que instalaste el SDK en tu computadora, puedes empezar a desarrollar tu primera aplicación con Bing Maps:

  1. Crea un proyecto de Silverlight en Visual Studio 2008 o superior (para este tutorial estoy suponiendo que ya se cuenta con Visual Studio y Silverlight instalado, en caso de que no cuentes con una version nueva de Visual Studio y seas un estudiante, puedes conseguirlo de manera gratuita y oficialemte gracias a Dreamspark)
  2. Cuando te pregunte, marca la opción de hostear la aplicación en un nuevo sitio Web.image
  3. El siguiente paso es referenciar las librerias que acabas de instalar a tu proyecto, da click derecho en folder de “References” del proyecto de Silverlight y selecciona “Add Reference”  Add Reference
  4. Selecciona la pestaña de Browse y navega al directorio donde instalaste el Silverlight Control SDK (normalmente debe ser algo como C:\Program Files\Bing Maps Silverlight Control\V1\Libraries). Selecciona las librerias y da click en “OK”image
  5. Agrega el control a tu proyecto creando un namespace en la clase principal. Dentro del tag UserControl teclea la siguiente línea:
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl";
    
  6. Ahora sólo queda insertar al mapa, dentro de la etiqueta Grid agrega al elemento Map y dale la credencial que obtuviste al crear tu cuenta en Bing Maps:
    <Grid x:Name="LayoutRoot" Background="White">
       <m:Map CredentialsProvider="aqui va la credencial">
    
       </m:Map>
    </Grid>
    

    Si corres el programa en este punto obtendrás algo como lo siguiente:image

  7. Ya cuentas con un mapa completamente funcional pero que inicia por default con la vista Road. Para especificar como quieres que inicie puedes modificar los atributos de Map haciendo algo como lo
    siguiente:

    <Grid x:Name="LayoutRoot" Background="White">
          <m:Map  CredentialsProvider="credencial"
                      Mode="AerialwithLabels"
                      ScaleVisibility="Collapsed"
                     NavigationVisibility="Collapsed">
          </m:Map>
    </Grid>

Mode está especificando cuál será la vista inicial, y las otras dos instrucciones estan escondiendo los controles, de manera que al final se ve así:

Y eso es todo. Empezar a desarrollar con esta plaraforma es muy sencillo y se pueden hacer cosas bastante interesantes.Para conocer con más profundidad lo que se puede hacer con Bing Maps de manera rápida puedes visitar el Silverlight Interactive SDK.

Microsoft Live@edu

February 1, 2010

Conoce más de Live@edu

Una de las plataformas que ha creado Microsoft para apoyar a la comunidad académica es Live@edu, con esta plataforma las escuelas tienen acceso a un grupo de servicios que fueron hechos para ayudar tanto a alumnos como a maestros.

El principal de estos servicios es el correo electrónico de la esucela:

Actualmente no son muchas las escuelas que pueden ofrecer correo electrónico a sus alumnos y, las que pueden hacerlo, normalmente lo hacen con muy poca capacidad.

Para resolver esto, Microsoft permite crear a las escuelas cuentas de correo electrónico para todo su personal de manera gratuita (con capacidad de 25GB), sin que la escuela tenga que preocuparse por soportar las cuentas de todos sus alumnos. Además Live@edu permite personalizar la interfaz de sus servicios según la escuela y crear las cuentas con el formato cuenta@nombreescuela.

Ejemplo de la personalizacion de la Universidad de Washington

Entre los demás servicios que Live@edu ofrece se encuentran:

  • Microsoft Outlook Live
  • Micorosft Office Live WorkSpace
  • Windows Live SkyDrive
  • Windows Live Spaces
  • Windows Live Writer
  • Windows Live Calendar
  • entro otros…

Y acceso a los programas de:

  • Dreamspark:
    Permite el acceso gratuito de los estudiantes a software profesional para desarrollo de Microsoft
  • Bizspark:
    Programa que apoya a las incubadoras de negocios de las instituciones proporcionando acceso gratuito a herramientas y tecnologías de Microsoft, para uso en la producción e implementación de aplicaciones que utilizará el negocio.

Microsoft ofrece este servicio a cualquier tipo de escuelas, desde preescolar hasta universidad y sin importar sin son públicas o privadas, facilitando el contacto con sus alumnos, permitiendo ofrecer más valor y tener una mejor presentación como escuela.

Para más información sobre Live@edu y su implementación puedes ir a:liveatedu.com