如何使覆盖控制高于所有其他控制?

我需要让一个控件出现在所有其他控件之上,这样它就会部分地覆盖它们。

275754 次浏览

如果你在你的布局中使用 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

“网格”的同一单元格中的控件反向呈现。因此,将一个控件放在另一个控件上的一个简单方法是将它放在同一个单元格中。

这里有一个有用的例子,它弹出一个面板,在执行一个长时间运行的任务(即当 BusyMessage绑定属性不为 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>

这是 WPF 中 爱慕者的一个常见功能。Adorners 通常出现在所有其他控件之上,但是其他提到 z 顺序的答案可能更适合您的情况。

<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>