Devo far apparire un controllo sopra tutti gli altri controlli, quindi li sovrapporrà parzialmente.
Se stai usando un Canvas
o Grid
nel tuo layout, dai il controllo per mettere in cima un ZIndex
.
Da 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>
Se non specifichi ZIndex
, i figli di un pannello vengono visualizzati nell'ordine in cui sono stati specificati (ovvero l'ultimo in alto).
Se stai cercando di fare qualcosa di più complicato, puoi vedere come ChildWindow
è implementato in Silverlight. Sovrappone uno sfondo semitrasparente e un popup sull'intero RootVisual
.
Robert Rossney ha una buona soluzione. Ecco una soluzione alternativa che ho usato in passato che separa "Overlay" dal resto del contenuto. Questa soluzione sfrutta la proprietà collegata Panel.ZIndex
per posizionare "Overlay" in cima a tutto il resto. Puoi impostare la visibilità del "Overlay" nel codice o utilizzare un 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>
I controlli nella stessa cella di una griglia vengono visualizzati frontalmente. Quindi un modo semplice per mettere un controllo sopra l'altro è metterlo nella stessa cella.
Ecco un utile esempio, che fa apparire un pannello che disabilita tutto nella vista (cioè il controllo utente) con un messaggio occupato mentre viene eseguita un'attività di lunga durata (cioè mentre la proprietà associata BusyMessage
non è nulla):
<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>
Metti il controllo che vuoi mettere in primo piano alla fine del tuo codice xaml. Cioè.
<Grid>
<TabControl ...>
</TabControl>
<Button Content="ALways on top of TabControl Button"/>
</Grid>
Questa è una funzione comune di Adorners in WPF. Gli ornatori di solito appaiono sopra tutti gli altri controlli, ma le altre risposte che menzionano l'ordine z potrebbero adattarsi meglio al tuo caso.
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>