Feedback

C# - Fenster am Bildschirmrand andocken (auch WPF)

Veröffentlicht von am 5/23/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.
/// <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!