The Artima Developer Community
Sponsored Link

.NET Buzz Forum
WPF: BringToFront und SendToBack

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
WPF: BringToFront und SendToBack Posted: Nov 19, 2007 8:15 AM
Reply to this message Reply

This post originated from an RSS feed registered with .NET Buzz by -.
Original Post: WPF: BringToFront und SendToBack
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
Unter Windows Forms gibt es die Methoden BringToFront und SendToBack um Controls in den Vordergrund zu bringen oder in den Hintergrund zu setzen. Diese Methoden sind in der Windows Presentation Foundation nicht mehr vorhanden. Bei der WPF verfügt jedes Element über eine ZOrder (quasi ein Index, welcher den Verlauf über die Z-Achse beschreibt). Elemente die später hinzugefügt werden, besitzen einen höheren Index und sind somit auf der Z-Achse höher oben angesiedelt und liegen daher über Elementen niedrigerer Ordnung.

Um nun BringToFront und SendToBack zur Verfügung zu stellen, muss die ZOrder manuell angepasst werden. Dies wird mit nachfolgender Methode gezeigt.
private void ChangeZOrder(bool bringToFront)
{

    int iNewIndex = -1;
    Canvas parentElement = (Canvas)_parentElement;
    if (bringToFront)
    {
        foreach (UIElement elem in parentElement.Children)
            if (elem.Visibility != Visibility.Collapsed)
                ++iNewIndex;
    }
    else
    {
        iNewIndex = 0;
    }

    int iOffset = (iNewIndex == 0) ? +1 : -1;
    int iElemCurIndex = Canvas.GetZIndex(this);

    foreach (UIElement child in parentElement.Children)
    {
        if (child == this)
            Canvas.SetZIndex(this, iNewIndex);
        else
        {
            int iZIndex = Canvas.GetZIndex(child);

            if (bringToFront && iElemCurIndex < iZIndex ::
                !bringToFront && iZIndex < iElemCurIndex)
            {
                Canvas.SetZIndex(child, iZIndex + iOffset);
            }
        }
    }
}

Hierbei ist folgendes zu beachten: In dieser Methode wird auf das Element _parentElement zugegriffen. Hintergrund ist der, dass die Methode (in meinem Fall) in einer Basisklasse für spezielle Controls definiert wurde und mittels der beiden nachfolgenden Methoden in allen entsprechenden Controls zur Verfügung steht. Genauso könnte es eine Ableitung des Containers (in diesem Fall ein Canvas) geben, dem mitgeteilt wird, welches Child manipuliert werden soll.
public void BringToFront()
{
    ChangeZOrder(true);
}

public void SendToBack()
{
    ChangeZOrder(false);
}

Gegenenfalls muss hier an die eigenen Bedürfnisse angepasst werden, es passiert jedoch nichts Aufregendes. Im Falle von SendToBack wird als ZIndex 0 gesetzt, d.h. das Element ist anschließend das erste auf dem Container und wird ganz hinten angezeigt, im Falle von BringToFront geht's in die andere Richtung.

Noch ein kleiner Hinweis: muss das Parent-Objekt gesucht werden, kann dies damit erledigt werden:
UIElement parent = VisualTreeHelper.GetParent(myElement);

Read: WPF: BringToFront und SendToBack

Topic: .NET Snippets startet den 2. Snippet-Wettbewerb Previous Topic   Next Topic Topic: Local History Feature unter Visual Studio 2005

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use