Мені потрібно зробити так, щоб елемент керування відображався над усіма іншими елементами управління, тому він частково накладе їх.
Мені потрібно зробити так, щоб елемент керування відображався над усіма іншими елементами управління, тому він частково накладе їх.
Відповіді:
Якщо ви використовуєте макет 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
.
Роберт Россні має хороше рішення. Ось альтернативне рішення, яке я використовував у минулому, яке відокремлює "Накладку" від решти вмісту. Це рішення використовує перевагу доданої властивості, 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>
Елементи керування в одній комірці сітки рендеруються назад. Отже, простий спосіб поставити один елемент управління на інший - помістити його в одну клітинку.
Ось корисний приклад, який спливає панель, яка вимикає все у представленні даних (тобто управління користувачем) із зайнятим повідомленням під час виконання тривалого завдання (тобто, поки 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>
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>