Laden...

Wpf-Fenster Flackern bei größen Änderung

Erstellt von Fairrueckt vor 5 Jahren Letzter Beitrag vor 5 Jahren 664 Views
F
Fairrueckt Themenstarter:in
1 Beiträge seit 2018
vor 5 Jahren
Wpf-Fenster Flackern bei größen Änderung

Guten Tag,

bei dem Versuch ein Benutzerdefiniertes WPF Anwendungsfenster zu gestalten komme ich an
einem kleinen Problem nicht vorbei und hoffe nach tage langen Googlen auf eure Hilfe.

Folgende Fenster Eigenschaften sollen gegeben sein:
WindowStyle="None" ResizeMode="CanResize"

Nun mein Problem:
Bei der Eigenschaft „CanResize“ taucht oben in der No-Client-Area ein weißer Balken auf.
Ich will gerne die „CanResize“ Eigenschaft benutzen, da diese das Fenster sehr smooth
vergrößert und verkleinert ohne ein flackern. Gibt es eine Möglichkeit diesen Balken in
irgendeiner Weise zu manipulieren (Farbe oder Höhe)?

Ich habe auch schon diverse Möglichkeiten ausprobiert, wo die Resize-Methode über die
user32.dll bzw direkt im Code realisiert wird oder mit der Klasse WindowChrome über
einen benutzerdefinierten Still. Doch habe ich bei jeder dieser getesteten Dinge immer
das Problem, dass das Fenster flackert beim Verkleinern oder vergrößern.

Noch kurz dazu gesagt, dass ich ein absoluter Anfänger in WPF/C# bin.
Also bitte nicht allzu Böse sein wenn ich hier alles durcheinander geworfen habe.
Ich würde mich riesig über evtl. Hilfe freuen oder ein kleinen Tipp.

Ein Beispiel wie ich es mit der Chrome-Klasse aus WPF versucht habe:
https://stackoverflow.com/questions/6792275/how-to-create-custom-window-chrome-in-wpf

Dinge die ich so probiert habe über den Code zu lösen:
https://blog.magnusmontin.net/2013/03/16/how-to-create-a-custom-window-in-wpf/

Oder aktuell probiert hab über die user32.dll:



        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr
        lParam);

        [DllImportAttribute("user32.dll")]
        public static extern bool ReleaseCapture();

        private void WindowDrag(object sender, MouseButtonEventArgs e)
        {
            ReleaseCapture();
            SendMessage(new WindowInteropHelper(this).Handle,
                0xA1, (IntPtr)0x2, (IntPtr)0);
        }

        private void WindowResize(object sender, MouseButtonEventArgs e) 
        {
            HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as
            HwndSource;
            SendMessage(hwndSource.Handle, 0x112, (IntPtr)61443, IntPtr.Zero);
        }

        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

        }


1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

um genau zu sein sprichst du die "Non-Client Area" an - die lässt sich unter WPF auch entsprechend anpassen - das ist zwar für einen Anfänger nicht unbedingt so leicht - letztendlich aber gut dokumentiert.

Die Themen sind zwar alle eher auf "Skinning" ausgelegt - bieten aber letztendlich was du möchtest: Funktionalität beibehalten - aber mit anderem Aussehen.

Zum Einstieg kannst du dir die beiden Sachen mal anschauen:

LG