Efecto Aero mediante WPF

Con la llegada de Windows Vista apareció el efecto Aero, pero como realizar este efecto en las aplicaciones de WPF que desarrollamos con Visual Studio 2008 y además que este efecto se aplique a toda la ventana de la aplicación??

Bien pues aquí te muestro una solución que te llevará por una serie de pasos para lograr el efecto deseado.

Una vez creado un nuevo proyecto de WPF y añadirle los distintos controles vamos a meternos en faena. Empezaremos añadiendo la referencia PresentationFramework.Aero para que nuestra aplicación utilice las correspondientes librerías a la hora de realizar el efecto.

Crearemos una nueva clase que deberá contener las directivas:

  • using System.Runtime.InteropServices;
  • using System.Collections.Generic;

Dentro de la clase introduciremos el siguiente código:

namespace AeroGlassExample

{

public class GlassHelper

{

struct MARGINS

{

public MARGINS(Thickness t)

{

Left = (int)t.Left;

Right = (int)t.Right;

Top = (int)t.Top;

Bottom = (int)t.Bottom;

}

public int Left;

public int Right;

public int Top;

public int Bottom;

}

 

[DllImport("dwmapi.dll", PreserveSig = false)]

static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);

 

[DllImport("dwmapi.dll", PreserveSig = false)]

static extern bool DwmIsCompositionEnabled();

//utilización de las diferentes apis para realizar el efecto

 

public static bool ExtendGlassFrame(Window window, Thickness margin)

{

if (!DwmIsCompositionEnabled())

return false;

 

IntPtr hwnd = new WindowInteropHelper(window).Handle;

if (hwnd == IntPtr.Zero)

throw new InvalidOperationException("The Window must be shown before extending glass.");

 

// Estableces transparencia tanto para WPF como para Win32

SolidColorBrush background = new SolidColorBrush(Colors.Red);

background.Opacity = 0.5;

window.Background = Brushes.Transparent;

HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;

 

MARGINS margins = new MARGINS(margin);

DwmExtendFrameIntoClientArea(hwnd, ref margins);

return true;

}

}

}

Esta clase será las que marque el marco de aplicación del efecto Aero y será utilizada en el código Behind de nuestra aplicación.

Ahora nos situaremos en el código Behind, por defecto (Window1.xaml.cs) e incluiremos las siguientes lineas de código:

public partial class Window1 : Window

{

private int _top = 10, _left = 10, _right = 200, _bottom = 200;

private bool neverRendered = true;

public Window1()

{

InitializeComponent();

this.SourceInitialized += new EventHandler(Window1_SourceInitialized);

}

private void OnMove(object s, DragDeltaEventArgs e)

{

_left += (int)e.HorizontalChange;

_top += (int)e.VerticalChange;

this.Left = _left;

this.Top = _top;

 

}

void Window1_SourceInitialized(object sender, EventArgs e)

{

GlassHelper.ExtendGlassFrame(this, new Thickness(-1));

}

protected override void OnContentRendered(EventArgs e)

{

if (this.neverRendered)

{

//La ventana toma el tamaño del contenido

//porque SizeToContent establece el tamaño a través de Width And Height.

//A continuación, permite establecer al usuario el tamaño de la ventana

//con su correspondiente efecto Aero

this.SizeToContent = SizeToContent.Manual;

 

FrameworkElement root = this.Content as FrameworkElement;

if (root != null)

{

root.Width = double.NaN;

root.Height = double.NaN;

}

 

this.neverRendered = false;

}

 

base.OnContentRendered(e);

}

}

De este modo conseguiremos crear el efecto Aero en toda la ventana, consiguiendo que las aplicaciones se integren en el entorno de Windows Vista de una forma sutil y sencilla.

EfectoAerom1

Deja un comentario

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