[WPF] Fenstermanagement
-
Hallo zusammen,
unter http://msdn.microsoft.com/en-us/library/aa302340.aspx hatte man immer eine Übersicht, welche Funktionen der Win32 API denen in WinForms entsprechen. Das war sehr praktisch, weil ich sehr viel mit Fenstern mache. Jetzt habe ich mit WPF angefangen und festgestellt, dass man ja im prinzip nur auf den Inhalt des Fensters Einfluss hat. D.h. bei einem bestimmten Style wird dieser nur auf den Inhalt und NICHT auf den Fensterrahmen verwendet. Dieser scheint wohl immer noch über das GDI zu laufen. Nun würde ich auch gerne das Aussehen des Rahmens ändern, jedoch möglichst über managed Code und möglichst ohne WinForms. Es soll eben eine managed Code Anwendung sein, die ausschließlich auf WPF basiert.
Gibt es da irgendwelche Möglichkeiten?
Danke!
Grüße
Fresh
-
Fresh0razoR schrieb:
Dieser scheint wohl immer noch über das GDI zu laufen.
Nein, GDI wird von WPF nicht mehr verwendet (WPF baut komplett auf DirectX auf, und verwendet auch die Win32 API nicht mehr).
Und in WPF kann jedes Control bis in seine Einzelteile (u.a. Rahmen komplett zerlegt, und neu zusammengestellt werden). Stichpunkte sind z.B. logischer vs. visueller Objektbaum (siehe hierzu z.B. MSDN) - dich interessiert der "Visual Tree" und das Thema Templates (Siehe hierzu z.B. das Beispiel).
-
aber warum kann ich dann mit wpf den luna style von XP nicht überschreiben? das funktioniert irgendwie nicht.
-
asc schrieb:
Nein, GDI wird von WPF nicht mehr verwendet (WPF baut komplett auf DirectX auf, und verwendet auch die Win32 API nicht mehr).
Nur innerhalb des Client bereichs, die Window Titelleiste und die Minimieren, Maximieren und Schließen Buttons werden auf den alten Wege gezeichnet.
@Fresh0razoR
Für alle Controls kannst du ein Style festlegen:<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
Nun sind alle Controls per Default im Luna style, auch unter Windows XP.
Das wird aber nicht empfohlen, eine Applikation sollte stets so aussehen wie das Window Theme es vor gibt.Den Fensterramen kannst du selber nicht beeinflussen, was du machen kannst ist ein Rahmenloses Fenster zu machen (WindowStyle = None) und den Rahmen sowie die System Buttons in WPF Selber zu zeichnen, dann musst du dich aber um alles selber kümmern.
Wenn du mit der WinApi vertraut bist kannst du dich auch in den Fenster WinApi Handle hooken, da hast du dann alle WinApi Möglichkeiten:
public class CustomWindow : Window { protected override void OnSourceInitialized(EventArgs e) { var handle = (new WindowInteropHelper(this)).Handle; HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(WindowProc)); base.OnSourceInitialized(e); } private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0024: //WmGetMinMaxInfo(hwnd, lParam); //Just an example handled = true; break; } return (IntPtr)0; } }
Benutzung dann:
namespace DemoApp { public partial MyWindow : CustomWindow { public MyWindow1() { InitializeComponent(); } } }
<Custom:MyWindow x:Class="DemoApp.MyWindow" xmlns:Custom="clr-namespace:DemoApp"> </Custom:MyWindow>
//Edit: Demo Code ausgebessert ^^