Jak sprawić, by nakładka była ponad wszystkimi innymi kontrolkami?


166

Muszę sprawić, by kontrolka pojawiła się nad wszystkimi innymi kontrolkami, więc częściowo je nałoży.

Odpowiedzi:


162

Jeśli używasz Canvaslub Gridw swoim układzie, ustaw wyżej kontrolkę, która ma być umieszczona na górze ZIndex.

Z 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 określisz ZIndex, elementy podrzędne panelu są renderowane w kolejności, w jakiej zostały określone (tj. Ostatnie na górze).

Jeśli chcesz zrobić coś bardziej skomplikowanego, możesz zobaczyć, jak ChildWindowjest zaimplementowany w Silverlight. Nakłada półprzezroczyste tło i wyskakujące okienko na całą zawartość RootVisual.


Uwaga: to nie jest tak, jak oczekiwałem HTML Canvas. Nie jest przeznaczony do bezpośredniego rysowania, ale zapewnia bezwzględny kontekst pozycjonowania (do którego zwykle można bezpośrednio wstawiać kształty).
— Paul

73

Robert Rossney ma dobre rozwiązanie. Oto alternatywne rozwiązanie, z którego korzystałem w przeszłości, które oddziela „Nakładkę” od reszty zawartości. To rozwiązanie wykorzystuje dołączoną właściwość, Panel.ZIndexaby umieścić „Nakładkę” na wszystkim innym. Możesz ustawić widoczność „Nakładki” w kodzie lub użyć pliku 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>

Ta nakładka pokryje całe okno, a nie tylko określony obszar.
— Metro Smurf

Najlepsze rozwiązanie w historii! Dziękuję Ci!
— Deweloper

Dokładnie to, czego potrzebowałem, aby umieścić „ekran prywatności” na całym oknie mojej aplikacji (np. Aby ukryć poufne informacje, jeśli użytkownik odejdzie od swojego biurka), z bardzo małą ilością kodu. Niesamowite!
— Whitzz

39

Kontrolki w tej samej komórce siatki są renderowane od tyłu do przodu. Tak więc prostym sposobem na umieszczenie jednej kontrolki na drugiej jest umieszczenie jej w tej samej komórce.

Oto przydatny przykład, który wyświetla panel, który wyłącza wszystko w widoku (tj. Element sterujący użytkownika) z komunikatem o zajętości podczas wykonywania długotrwałego zadania (tj. Gdy BusyMessagewłaściwość powiązana nie jest pusta):

<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

Umieść kontrolkę, którą chcesz przenieść na pierwszy plan na końcu kodu XAML. To znaczy

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

13

Jest to typowa funkcja Adorners w WPF. Ozdoby zwykle pojawiają się nad wszystkimi innymi kontrolkami, ale inne odpowiedzi, które wspominają o kolejności z, mogą lepiej pasować do twojego przypadku.


3
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.