Як зробити контроль накладання над усіма іншими елементами управління?


166

Мені потрібно зробити так, щоб елемент керування відображався над усіма іншими елементами управління, тому він частково накладе їх.

Відповіді:


162

Якщо ви використовуєте макет Canvasабо Gridу своєму макеті, дайте елемент управління, щоб його було поставлено вище ZIndex.

Від 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>

Якщо ви не вказуєте ZIndex, діти панелі відображаються в тому порядку, в якому вони вказані (тобто останній зверху).

Якщо ви хочете зробити щось складніше, ви можете подивитися, як ChildWindowце реалізовано в Silverlight. Він накладає напівпрозорий фон і спливає весь ваш RootVisual.


Примітка. Це не так, як HTML Canvas, як я очікував. Він не призначений для прямого малювання, але забезпечує абсолютний контекст позиціонування (у який ви зазвичай безпосередньо вкладаєте фігури).
Павло

73

Роберт Россні має хороше рішення. Ось альтернативне рішення, яке я використовував у минулому, яке відокремлює "Накладку" від решти вмісту. Це рішення використовує перевагу доданої властивості, Panel.ZIndexщоб розмістити "Накладку" поверх усього іншого. Ви можете або встановити видимість "Overlay" в коді, або використовувати 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>

Ця накладка охопить усе вікно, а не лише конкретну область.
Метро Смурф

Найкраще рішення будь-коли! Дякую!
Розробник

Саме те, що мені потрібно було розмістити "екран конфіденційності" над усім моїм вікном програми (наприклад, щоб приховати конфіденційну інформацію, якщо користувач відходить від свого столу), з дуже невеликим кодом. Дивовижно!
Вітзз

39

Елементи керування в одній комірці сітки рендеруються назад. Отже, простий спосіб поставити один елемент управління на інший - помістити його в одну клітинку.

Ось корисний приклад, який спливає панель, яка вимикає все у представленні даних (тобто управління користувачем) із зайнятим повідомленням під час виконання тривалого завдання (тобто, поки BusyMessageпов'язане властивість не є нульовим):

<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

Поставте елемент керування, який ви хочете вивести на передню частину в кінці коду Xaml. Тобто

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

13

Це звичайна функція Adorners у WPF. Прикраси зазвичай з’являються над усіма іншими елементами управління, але інші відповіді, в яких згадується z-порядок, можуть краще відповідати вашому випадку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.