我需要让一个控件出现在所有其他控件之上,这样它就会部分地覆盖它们。
如果你在你的布局中使用 Canvas或者 Grid,给控件一个更高的 ZIndex。
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,那么面板的子元素将按照指定的顺序呈现(即顶部的最后一个)。
如果您想做一些更复杂的事情,那么您可以看看在 Silverlight 中是如何实现 ChildWindow的。它覆盖了一个半透明的背景和弹出在您的整个 RootVisual。
ChildWindow
RootVisual
“网格”的同一单元格中的控件反向呈现。因此,将一个控件放在另一个控件上的一个简单方法是将它放在同一个单元格中。
这里有一个有用的例子,它弹出一个面板,在执行一个长时间运行的任务(即当 BusyMessage绑定属性不为 null 时)时禁用视图中的所有内容(即用户控件) :
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>
这是 WPF 中 爱慕者的一个常见功能。Adorners 通常出现在所有其他控件之上,但是其他提到 z 顺序的答案可能更适合您的情况。
罗伯特 · 罗斯尼有一个很好的解决方案。下面是我过去使用过的一个替代方案,它将“叠加”与其他内容区分开来。这个解决方案利用附加的属性 Panel.ZIndex将“叠加”放在其他所有东西的顶部。您可以在代码中设置“ Overlay”的可见性,也可以使用 DataTrigger。
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>
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570"> <!-- YOUR XAML CODE --> </Canvas>
将要带到前面的控件放在 xaml 代码的末尾。
<Grid> <TabControl ...> </TabControl> <Button Content="ALways on top of TabControl Button"/> </Grid>