Jak zrobić overlay control ponad wszystkie inne kontrolki?

Muszę sprawić, by kontrolka pojawiła się ponad wszystkie inne kontrolki, więc częściowo je nałoży.

Author: Taterhead, 2011-03-27

6 answers

Jeśli używasz Canvas lub Grid w swoim układzie, daj kontrolkę, która ma być umieszczona na górze wyższej ZIndex.

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

Jeśli nie podasz ZIndex, dzieci panelu będą renderowane w podanej kolejności (tj. ostatniej na górze).

Jeśli chcesz zrobić coś bardziej skomplikowanego, możesz spojrzeć na to, jak ChildWindow jest zaimplementowane w Silverlight. Nakłada półprzezroczyste tło i wyskakujące okienko na cały RootVisual.

 132
Author: foson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-24 15:19:44

Robert Rossney ma dobre rozwiązanie. Oto alternatywne rozwiązanie, którego używałem w przeszłości, które oddziela "nakładkę" od reszty treści. To rozwiązanie wykorzystuje dołączoną Właściwość Panel.ZIndex, aby umieścić "nakładkę" na wszystko inne. Możesz ustawić widoczność "nakładki" w kodzie lub użyć 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
Author: Metro Smurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26

Elementy sterujące w tej samej komórce siatki są renderowane z powrotem do przodu. Więc prostym sposobem na umieszczenie jednego sterowania na drugim jest umieszczenie go w tej samej komórce.

Oto użyteczny przykład, który wyświetla panel, który wyłącza wszystko w widoku (tj. kontrolę użytkownika) z Komunikatem zajęty podczas wykonywania długotrwałego zadania (tj. gdy właściwość BusyMessage bound nie jest null):

<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
Author: Robert Rossney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-27 17:53:59

Umieść kontrolkę, którą chcesz wprowadzić na początek na końcu kodu xaml. I. E.

<Grid>
  <TabControl ...>
  </TabControl>
  <Button Content="ALways on top of TabControl Button"/>
</Grid>
 16
Author: artos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 10:36:10

Jest to wspólna funkcja Adorners w WPF. Ozdoby zazwyczaj pojawiają się ponad wszystkimi innymi kontrolkami, ale inne odpowiedzi, które wspominają o z-order, mogą lepiej pasować do twojego przypadku.

 9
Author: CodeNaked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 08:35:07
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
 3
Author: Devam Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 15:55:42