Feedback

C# - Fenster am Bildschirmrand andocken (auch WPF)

Veröffentlicht von am 23.05.2013
(1 Bewertungen)
Einige Programme, wie beispielsweise Skype, heften sich an den Bildschirmrand an, wenn man das Fenster in die Nähe schiebt. Diese Erweiterungsmethode muss im LocationChanged-Eventhandler aufgerufen werden. Die Parameter sind in der XML-Doku näher beschrieben.

Hinweis: Diese Methode lässt auch relativ leicht für WPF umsetzen.
Snippet in VB übersetzen
/// <summary>
/// Überprüft ob eine Form in der Nähe von einem Bildschirmrand ist.
/// </summary>
/// <param name="frm">Die Form, deren Position überprüft werden soll.</param>
/// <param name="px">Die Mögliche Differenz vom Rand in Pixel.</param>
/// <param name="snap"><c>True</c>, wenn das Fenster an den entsprechenden Rand verschoben werden soll, ansonsten <c>>False</c>.</param>
/// <returns><c>True</c>, wenn das Fenster einen BHildschirmrand berührt oder sich in der Nähe befindet, andernfalls <c>False</c>.</returns>
/// <exception cref="System.ArgumentNullException">Wird ausgelöst, wenn die Form <c>null</c> ist.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">Wird ausgelöst, wenn px kleiner als 0 ist.</exception>
public static bool IsTouchingScreenBorder(this Form frm, int px, bool snap)
{
    if (frm == null)
        throw new ArgumentNullException("frm", "Condition: frm != null");
    if (px < 0)
        throw new ArgumentOutOfRangeException("Condition: px >= 0");

    bool result = false;
    bool v = false, h = false;
    foreach (Screen s in Screen.AllScreens)
    {
        if (!h)
        {
            if (s.WorkingArea.Left - px < frm.Left && s.WorkingArea.Left + px > frm.Left)
            {
                if(snap)
                    frm.Left = s.WorkingArea.Left;
                h = true;
                result = true;
            }
            else if (s.WorkingArea.Right - px < frm.Right && s.WorkingArea.Right + px > frm.Right)
            {
                if(snap)
                    frm.Left = s.WorkingArea.Right - frm.Width;
                h = true;
                result = true;
            }
        }
        if (!v)
        {
            if (s.WorkingArea.Top - px < frm.Top && s.WorkingArea.Top + px > frm.Top)
            {
                if(snap)
                    frm.Top = s.WorkingArea.Top;
                v = true;
                result = true;
            }
            else if (s.WorkingArea.Bottom - px < frm.Bottom && s.WorkingArea.Bottom + px > frm.Bottom)
            {
                if(snap)
                    frm.Top = s.WorkingArea.Bottom - frm.Height;
                v = true;
                result = true;
            }
        }
        if (v && h)
            return result;
    }
    return result;
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!