Come rendere il controllo overlay sopra tutti gli altri controlli?


166

Devo far apparire un controllo sopra tutti gli altri controlli, quindi li sovrapporrà parzialmente.

Risposte:


162

Se stai usando un Canvaso Gridnel tuo layout, dai il controllo per essere messo in primo piano 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 si specifica 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 ChildWindowviene implementato in Silverlight. Sovrappone uno sfondo semitrasparente e un popup sull'intero RootVisual.


Nota: questo non è come la tela HTML come mi aspettavo. Non è pensato per il disegno diretto, ma fornisce un contesto di posizionamento assoluto (in cui di solito inseriresti direttamente le forme).
Paul

73

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.ZIndexper posizionare "Overlay" sopra tutto il resto. È possibile impostare la visibilità della "Sovrapposizione" nel codice o utilizzare a 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>

Questo overlay coprirà l'intera finestra, non solo un'area specifica.
Metro Puffo

La migliore soluzione di sempre! Grazie!
Sviluppatore

Esattamente ciò di cui avevo bisogno per posizionare una "schermata di privacy" su tutta la mia finestra dell'app (ad esempio per nascondere informazioni sensibili se l'utente si allontana dalla sua scrivania), con pochissimo codice. Eccezionale!
Whitzz,

40

I controlli nella stessa cella di una griglia vengono visualizzati frontalmente. Quindi un modo semplice per mettere un controllo sopra un altro è metterlo nella stessa cella.

Ecco un esempio utile, 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 BusyMessageproprietà associata 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>

23

Metti il ​​controllo che vuoi mettere in primo piano alla fine del tuo codice xaml. ie

<Grid>
  <TabControl ...>
  </TabControl>
  <Button Content="ALways on top of TabControl Button"/>
</Grid>

13

Questa è una funzione comune dei 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.


3
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.