HowTo: Rahmenlose WPF Apps mit Schattenwurf

image.png

Die Standard-Fenster von Windows verschwinden immer mehr und werden ersetzt durch schicker anmutende Bedienelemente. Diesmal meine ich allerdings keine “Metro” Apps, sondern normale, full-power Windows Applikationen.

Achtung: Der Blogpost ist sehr “Low-Level”. Es gibt bestimmt einige Libraries oder NuGet Packages, die diese Sachen mitbringen. Die herangehensweise hat auch 2 Nachteile!

Aus dem Drögen Standard (für Windows Desktop Applikationen):

image

Wird zum Beispiel sowas:

image

image

image

 1. Schritt: WPF Window Rahmenlos machen

Um ein “Window” komplett rahmenlos zu bekommen muss man die Eigenschaften “WindowStyle” auf “none” setzen und den “ResizeMode” auf “NoResize”.

<Window x:Class="DropShadow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Grid>

    </Grid>
</Window>

Ergebnis:

Man hat nun eine gänzlich weiße Fläche.

image

2. Schritt: Den Rahmen erzeugen

Ich hatte erst über diverse Styles es probiert, allerdings hab ich dann diese Lösung gefunden, welche direkt Betriebssystem Funktionen nutzt. Vorteil: Auf Windows 8 sieht es “dezenter” aus als auf Windows 7 – sprich: Es passt besser in das Gesamtbild des Betriebssystem.

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct Margins
        {
            public int leftWidth;
            public int rightWidth;
            public int topHeight;
            public int bottomHeight;
        }

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);

            var helper = new WindowInteropHelper(this);

            int val = 2;

            DwmSetWindowAttribute(helper.Handle, 2, ref val, 4);
            var m = new MainWindow.Margins { bottomHeight = -1, leftWidth = -1, rightWidth = -1, topHeight = -1 };

            DwmExtendFrameIntoClientArea(helper.Handle, ref m);
            IntPtr hwnd = new WindowInteropHelper(this).Handle;
        }

        [DllImport("dwmapi.dll", PreserveSig = true)]
        public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);

        [DllImport("dwmapi.dll")]
        public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
    }

Resultat:

image

Was man dabei beachten sollte:

Durch das rahmenlose Fenster muss man sich natürlich jetzt selber darum kümmern, dass der Anwender es vergrößern bzw. verkleinern kann und das man das Fenster verschieben kann. Ich vermute es gibt hier (wie oben erwähnt) irgendwelche Frameworks/Libraries/NuGet Packges die einem das Leben vereinfachen.

Die kompletten Sourcen findet ihr auf GitHub.

Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf dem Laufenden bleiben willst, abonniere unseren RSS Feed oder folge uns auf Twitter.

About the author

Written by Robert Mühsig

Hi, ich bin Robert Mühsig und bin Webentwickler und beschäftige mich mit Web-Frameworks auf dem Microsoft Web Stack und scheue mich auch nicht vor Javascript. Der Blog begann als "Problemsammelstelle und Lösungshilfe" und seitdem schreibe ich hier alles auf. Seit 2008 bin ich Microsoft MVP für ASP.NET. Treffen kann man mich online via Twitter (@robert0muehsig) oder hier.

4 Responses

  1. Zum Verschieben des Fensters gibt es DragMove(); z.B. so

    XAML:

    CodeBehind:

    private void Window_OnMouseleftButtonDown(object sender, MouseButtonEventArgs e)
    {
    DragMove();
    }

    Reply
  2. Hast damit aber noch einige Probleme. Zum Beispiel fehlt die AeroSnap-Funktion.
    Ich verwende momentan MahApps.Metro. Ist auch nicht perfekt, aber schon sehr nah dran.

    Reply
    • Ich hab es selbst nur für einen Splashscreen benutzt – daher reichte mir diese “low-level” Variante.
      Würdest du MahApps.Metro nicht weiter empfehlen? Die Demo App sieht doch ganz nett aus und auf der schnelle hab ich jetzt kein fehlendes “Windows-Standard-Fenster”-Feature gefunden.

      Reply
      • Empfehlen kann man es schon. Gibt nur so ein paar kleine Sachen. Zum Beispiel sollte man die Controls.xaml nicht in der App.xaml als Ressource angeben, da ansonsten die Tooltips nicht mehr lesbar sind.

        Reply

Comment on this post

Letzte Posts

  • image.png
    IIS & Windows Authentication – Troubleshooting mit Negotiate & NTLM

    Windows Authentifizierung ist eine einfache (und naheliegende) Authentifizierungs-Option für “Haus-interne” Webapplikationen. Setup Im IIS selbst kann man die Windows Authentifzierung sehr leicht anschalten: Natürlich kann man dies auch über die web.config steuern: <system.web> ... <authentication mode="Windows"/> ... </system.web> ... Fehlermeldung “HTTP Error 401.2 – Unauthorized”: Dies kann (wie fast immer) viele Gründe haben, z.B. weil ...

  • image.png
    Json-Online-Tools: Viewer & Json2Csharp Generator

    Wo APIs im Spiel sind, ist das JSON Format nicht weit. Da ich immer mal wieder zwei Tools benutze, möchte ich diese hier auch mal kurz würdigen. JSON Viewer Wer nur den JSON-Text vor sich hat sieht meist die Struktur nicht. Über JSON Viewer kann man sich recht einfach einen Überblick verschaffen: [URL] JSON2CSharp Der ...

  • image.png
    Tools & Vorgehen für Entwicklung rund um OpenXml oder wie erstelle ich Office Dokumente mit .NET?

    Durch meine Tätigkeit bei der  OneOffixx AG habe ich recht tiefe Einblicke in die Erstellung von Microsoft Office Dokumente mit .NET bekommen. Da das Problem “Office Dokumente per Code” zu erstellen recht verbreitet ist, schreib ich mal Empfehlungen für die ersten Schritte. Must Have Tools Ganz klar sollte man das Office in der jeweiligen Version ...

  • image.png
    Windows Phone SDK- & “System”-Icons

    Zwar legt das Metro Design viel Wert auf Typografie – jedoch sind auch Icons sehr wichtig. Wer das Windows Phone SDK installiert hat, bekommt 36 Icons mitgeliefert. Diese sind unter diesem Pfad zu finden: C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Icons Viele Icons, welche man von den eingebauten Anwendungen kennt, sind allerdings nicht enthalten. Pedro Lamas hat ...

  • image.png
    Wie finde ich heraus ob mein ADFS 2.0 funktioniert?

    Ich hatte mich recht lange mti dem Thema ADFS 2.0 (“Active Directory Federation Services”) beschäftigt und da kam die recht einfache Frage auf: Wie stelle ich fest ob die Verbindung zwischen ADFS und AD “funktioniert”? Hier eine simple Variante es zu testen… Was ist ein ADFS überhaupt? Wenn man über AD-Grenzen hinweg “Vertrauensstellungen” braucht, dann ...

Unterstützt von…

Facebook