如何使覆盖控制高于所有其他控件?
我需要使控件出现在所有其他控件之上,所以它会部分覆盖它们。
如果在布局中使用“canvas”或“网格”,请将控件置于较高的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。 它覆盖半透明的背景,并popup整个RootVisual。
罗伯特·罗斯尼有很好的解决scheme 这是我过去使用的另一种解决scheme,将“覆盖”与其他内容分开。 此解决scheme利用附加的属性Panel.ZIndex
将“Overlay”放在其他任何位置上。 您可以在代码中设置“Overlay”的可见性,也可以使用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
绑定的属性不为空时),popup一个面板来禁用视图中的所有内容(即用户控件):
<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中Adorners的一个常见function。 装饰者通常出现在所有其他控件之上,但其他提到z-顺序的答案可能更适合你的情况。
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570"> <!-- YOUR XAML CODE --> </Canvas>