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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我需要使一个控件出现在所有其他控件之上,因此它将部分覆盖它们。

提问于
用户回答回答于

如果在布局中使用画布或网格,则将要放在顶部的控件设置为更高的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中实现的。它覆盖了一个半透明的背景,并在整个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>

扫码关注云+社区