17 January 2008 .NET 3.0, Aero, Glass Effect, HowTo, Vista, Visual Studio 2008, WPF, XAML Robert Muehsig

Eine optische Verbesserung (jedenfalls für mich) stellt in Vista der so genannte Glass Effekt dar. Wer nun mit WPF arbeitet, wird vielleicht denken, dass solch ein Effekt direkt mit geliefert wird (immerhin ist .NET 3.0 in Vista fest integriert) - jedoch geht dies nicht so einfach.

Im Internet bin ich auf diesen Blogpost gestoßen - da das nicht schwierig aussah und auch schick war, ich aber nach einem simplen Beispiel suchte, habe ich mir schnell selber etwas zusammengetippt.

Hier das Ergebnis mal als Screenshot:

Ein Standard WPF Window:

image

Das Aero Window:

image

Was muss man dafür machen:

Wie in dem Blogartikel oben erwähnt, legt man folgende Klasse mit dem Source Code an:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Media;
using System.Windows;
using System.Windows.Interop;

namespace WPFAero
{
    public class GlassHelper
    {
        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.");

            // Set the background to transparent from both the WPF and Win32 perspectives
            window.Background = Brushes.Transparent;
            HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;

            MARGINS margins = new MARGINS(margin);
            DwmExtendFrameIntoClientArea(hwnd, ref margins);
            return true;
        }


        [DllImport("dwmapi.dll", PreserveSig = false)]
        static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);

        [DllImport("dwmapi.dll", PreserveSig = false)]
        static extern bool DwmIsCompositionEnabled();
    }

    
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;
}

}

Aero wird über die "dwmapi.dll" gebildet - am Ende ruft man eine einzelne statische Methode auf, welche man das Window übergibt.
Auf Codeproject habe ich dann noch eine andere Erweiterung dafür gefunden: Glass Effekt als Attached Property (Adding Glass Effect to WPF using Attached Properties)

Somit wäre es möglich, einem Window im Xaml direkt den Glass Effekt zuzuweisen:

<Window x:Class="GlassEffectDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace: GlassEffectDemo"
    src:GlassEffect.IsEnabled="True"
    Title="GlassEffect demo" Height="300" Width="300">
    <Grid>
    </Grid>
</Window>  

Wichtiger Hinweis: Aero gibt es nur auf Vistabasis und auch nur bei aktivierem Aero (sollte klar sein)

Wäre interessant zu erfahren, ob es bei diesem aktivieren Aero zu irgendwelchen WPF Schwierigkeiten kommen kann - getestet habe ich es noch nicht ;)

Das Demoprojekt könnt ihr wie immer Downloaden - Visual Studio 2008 & Vista ist aber Voraussetzung.

[ Download Democode ]


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de