Ich muss ein Steuerelement über allen anderen Steuerelementen anzeigen lassen, damit es sie teilweise überlagert.
Ich muss ein Steuerelement über allen anderen Steuerelementen anzeigen lassen, damit es sie teilweise überlagert.
Antworten:
Wenn Sie ein Canvas
oder Grid
in Ihrem Layout verwenden, geben Sie dem Steuerelement, das oben platziert werden soll, einen höheren Wert ZIndex
.
Von MSDN :
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WindowTitle="ZIndex Sample">
<Canvas>
<Rectangle Canvas.ZIndex="3" Width="100" Height="100" Canvas.Top="100" Canvas.Left="100" Fill="blue"/>
<Rectangle Canvas.ZIndex="1" Width="100" Height="100" Canvas.Top="150" Canvas.Left="150" Fill="yellow"/>
<Rectangle Canvas.ZIndex="2" Width="100" Height="100" Canvas.Top="200" Canvas.Left="200" Fill="green"/>
<!-- Reverse the order to illustrate z-index property -->
<Rectangle Canvas.ZIndex="1" Width="100" Height="100" Canvas.Top="300" Canvas.Left="200" Fill="green"/>
<Rectangle Canvas.ZIndex="3" Width="100" Height="100" Canvas.Top="350" Canvas.Left="150" Fill="yellow"/>
<Rectangle Canvas.ZIndex="2" Width="100" Height="100" Canvas.Top="400" Canvas.Left="100" Fill="blue"/>
</Canvas>
</Page>
Wenn Sie nichts angeben ZIndex
, werden die untergeordneten Elemente eines Bedienfelds in der angegebenen Reihenfolge gerendert (dh das letzte oben).
Wenn Sie etwas Komplizierteres tun möchten, können Sie sich ansehen, wie ChildWindow
es in Silverlight implementiert ist. Es überlagert einen halbtransparenten Hintergrund und ein Popup über Ihrem gesamten Hintergrund RootVisual
.
Robert Rossney hat eine gute Lösung. Hier ist eine alternative Lösung, die ich in der Vergangenheit verwendet habe und die das "Overlay" vom Rest des Inhalts trennt. Diese Lösung nutzt die angehängte Eigenschaft Panel.ZIndex
, um die "Überlagerung" über alles andere zu platzieren. Sie können entweder die Sichtbarkeit der "Überlagerung" im Code festlegen oder a verwenden DataTrigger
.
<Grid x:Name="LayoutRoot">
<Grid x:Name="Overlay" Panel.ZIndex="1000" Visibility="Collapsed">
<Grid.Background>
<SolidColorBrush Color="Black" Opacity=".5"/>
</Grid.Background>
<!-- Add controls as needed -->
</Grid>
<!-- Use whatever layout you need -->
<ContentControl x:Name="MainContent" />
</Grid>
Steuerelemente in derselben Zelle eines Rasters werden von hinten nach vorne gerendert. Eine einfache Möglichkeit, ein Steuerelement über ein anderes zu legen, besteht darin, es in dieselbe Zelle zu legen.
Hier ist ein nützliches Beispiel, das ein Fenster öffnet, in dem alles in der Ansicht (dh das Benutzersteuerelement) mit einer Besetztmeldung deaktiviert wird, während eine lange laufende Aufgabe ausgeführt wird (dh während die BusyMessage
gebundene Eigenschaft nicht null ist):
<Grid>
<local:MyUserControl DataContext="{Binding}"/>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility"
Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding BusyMessage}"
Value="{x:Null}">
<Setter Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Border HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="DarkGray"
Opacity=".7" />
<Border HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="White"
Padding="20"
BorderBrush="Orange"
BorderThickness="4">
<TextBlock Text="{Binding BusyMessage}" />
</Border>
</Grid>
</Grid>
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>