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
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.
privatevoid 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.
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: