Как сделать контроль оверлея выше всех других элементов управления?
Мне нужно сделать элемент управления выше всех других элементов управления,поэтому он будет частично накладывать их.
6 ответов:
если вы используете
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
чтобы разместить "наложение" поверх всего остального. Вы можете либо установить видимость "наложения" в коде, либо использовать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
свойство bound не равно 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>
поместите элемент управления, который вы хотите вывести на передний план в конце вашего кода xaml. То есть
<Grid> <TabControl ...> </TabControl> <Button Content="ALways on top of TabControl Button"/> </Grid>
Это общая функция декораторы в WPF. Украшатели обычно появляются над всеми другими элементами управления, но другие ответы, которые упоминают z-порядок, могут лучше соответствовать вашему случаю.