Saya perlu membuat kontrol muncul di atas semua kontrol lain, sehingga sebagian akan overlay.
Saya perlu membuat kontrol muncul di atas semua kontrol lain, sehingga sebagian akan overlay.
Jawaban:
Jika Anda menggunakan Canvas
atau Grid
dalam tata letak Anda, berikan kontrol untuk diletakkan di atas yang lebih tinggi ZIndex
.
Dari 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>
Jika Anda tidak menentukan ZIndex
, anak-anak panel diberikan sesuai urutan yang ditentukan (yaitu yang terakhir di atas).
Jika Anda ingin melakukan sesuatu yang lebih rumit, Anda dapat melihat bagaimana ChildWindow
penerapannya di Silverlight. Itu melapisi latar semi-transparan dan popup seluruh Anda RootVisual
.
Robert Rossney memiliki solusi yang bagus. Inilah solusi alternatif yang pernah saya gunakan di masa lalu yang memisahkan "Hamparan" dari konten lainnya. Solusi ini memanfaatkan properti terlampir Panel.ZIndex
untuk menempatkan "Hamparan" di atas segalanya. Anda dapat mengatur Visibilitas "Hamparan" dalam kode atau menggunakan a 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>
Kontrol di sel yang sama dari Grid diberikan kembali ke depan. Jadi cara sederhana untuk meletakkan satu kontrol di atas yang lain adalah dengan meletakkannya di sel yang sama.
Berikut ini adalah contoh yang berguna, yang memunculkan panel yang menonaktifkan segala sesuatu dalam tampilan (yaitu kontrol pengguna) dengan pesan sibuk saat tugas jangka panjang dijalankan (yaitu saat BusyMessage
properti terikat bukan nol):
<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>
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
<!-- YOUR XAML CODE -->
</Canvas>