Мне нужно сделать элемент управления выше всех остальных элементов управления, поэтому он будет частично перекрывать их.
Как сделать управление наложением выше всех других элементов управления?
Ответ 1
Если вы используете холст или сетку в своем макете, дайте элементу управления поставить поверх более высокого значения 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.
Ответ 2
Роберт Россни имеет хорошее решение. Здесь альтернативное решение, которое я использовал в прошлом, отделяет "Overlay" от остальной части контента. Это решение использует преимущества прилагаемого свойства Panel.ZIndex
, чтобы разместить "Overlay" поверх всего остального. Вы можете либо установить видимость "Overlay" в коде, либо использовать 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>
Ответ 3
Элементы управления в одной и той же ячейке сетки отображаются обратно. Таким образом, простой способ поставить один элемент управления поверх другого - это поместить его в одну ячейку.
Вот полезный пример, который выдает панель, которая отключает все в представлении (то есть пользовательский элемент управления) с сообщением "занято", когда выполняется долговременная задача (т.е. когда свойство привязки 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>
Ответ 4
Поместите элемент управления, который вы хотите перенести на передний план в конце кода xaml. То есть.
<Grid>
<TabControl ...>
</TabControl>
<Button Content="ALways on top of TabControl Button"/>
</Grid>
Ответ 5
Это общая функция Adorners в WPF. Надзиратели обычно появляются выше всех других элементов управления, но другие ответы, в которых упоминается z-порядок, могут лучше соответствовать вашему делу.
Ответ 6
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>