如何使叠加控件高于所有其他控件?


166

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

Answers:


161

如果在布局中使用CanvasGrid,则将控件放在顶部的位置较高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


注意:这与我期望的HTML Canvas不同。它不是直接绘制的,而是提供了一个绝对的定位上下文(您通常会直接将形状放入其中)。
保罗

73

罗伯特·罗斯尼(Robert Rossney)有一个很好的解决方案。这是我过去使用的替代解决方案,该解决方案将“叠加层”与其余内容分开。此解决方案利用附加属性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>

该覆盖层将覆盖整个窗口,而不仅仅是特定区域。
Metro Smurf

有史以来最好的解决方案!谢谢!
开发人员

正是我需要在我的整个应用程序窗口上放置一个“隐私屏幕”(例如,如果用户离开办公桌离开以隐藏敏感信息),而只需很少的代码。太棒了!
惠茨

39

网格的同一单元中的控件是从后到前呈现的。因此,将一个控件置于另一个控件之上的简单方法是将其放在同一单元格中。

这是一个有用的示例,它会弹出一个面板,该面板在执行长时间运行的任务时(即,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>

23

将要显示的控件放在xaml代码的末尾。即

<Grid>
  <TabControl ...>
  </TabControl>
  <Button Content="ALways on top of TabControl Button"/>
</Grid>

13

这是WPF 中装饰器的常见功能。装饰器通常出现在所有其他控件的上方,但是提到z顺序的其他答案可能更适合您的情况。


3
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.