Comment placer le contrôle de superposition au-dessus de tous les autres contrôles?

j'ai besoin de faire apparaître un contrôle au-dessus de tous les autres contrôles, donc il les superposera en partie.

134
demandé sur Taterhead 2011-03-27 21:37:28

6 réponses

si vous utilisez un Canvas ou Grid dans votre mise en page, donnez le contrôle à mettre sur le dessus un plus haut ZIndex .

de 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>

si vous ne spécifiez pas ZIndex , les enfants d'un panneau sont rendus dans l'ordre où ils sont spécifiés (c.-à-d. le dernier en haut).

Si vous cherchez à faire quelque chose de plus compliqué, vous pouvez regarder comment ChildWindow est mis en œuvre à Silverlight. Il recouvre un fond semi-transparent et apparaît sur l'ensemble de votre RootVisual .

132
répondu foson 2018-06-24 15:19:44

Robert Rossney est une bonne solution. Voici une autre solution que j'ai utilisé dans le passé qui sépare la "Superposition" du reste du contenu. Cette solution profite de la propriété attachée Panel.ZIndex pour placer la "superposition" sur le dessus de tout le reste. Vous pouvez définir la Visibilité de la "Superposition" dans le code ou utiliser 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>
52
répondu Metro Smurf 2017-05-23 11:33:26

Contrôles dans la même cellule d'une Grille sont rendus à l'arrière. Donc un moyen simple de mettre un contrôle sur une autre est de le mettre dans la même cellule.

voici un exemple utile, qui affiche un panneau qui désactive tout dans la vue (c.-à-d. le contrôle de l'utilisateur) avec un message occupé pendant qu'une tâche longue est exécutée (c.-À-D. Alors que la propriété liée BusyMessage n'est pas nulle):

<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>
35
répondu Robert Rossney 2011-03-27 17:53:59

mettez le contrôle que vous voulez mettre à l'avant à la fin de votre code xaml. C'est-à-dire:

<Grid>
  <TabControl ...>
  </TabControl>
  <Button Content="ALways on top of TabControl Button"/>
</Grid>
16
répondu artos 2014-10-12 10:36:10

il s'agit d'une fonction courante de Adorners dans WPF. Les Adorners apparaissent généralement au-dessus de tous les autres contrôles, mais les autres réponses qui mentionnent z-order peuvent mieux correspondre à votre cas.

9
répondu CodeNaked 2017-09-21 08:35:07
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
3
répondu Devam Mehta 2014-02-01 15:55:42