Tüm diğer kontrollerin üzerinde yer paylaşımı nasıl yapılır?


166

Bir kontrolün diğer tüm kontrollerin üzerinde görünmesini sağlamalıyım, bu yüzden kısmen onları kaplayacak.

Yanıtlar:


162

Eğer mizanpajınızda bir Canvasveya kullanıyorsanız Grid, daha üstte yer almak için kontrolü verin ZIndex.

Gönderen 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>

Belirtmezseniz ZIndex, panelin alt öğeleri belirtildikleri sırayla oluşturulur (yani sonuncusu üstte).

Daha karmaşık bir şey yapmak istiyorsanız, ChildWindowSilverlight'ta nasıl uygulandığına bakabilirsiniz . Yarı saydam bir arka plan ve açılır pencerenin tamamını kaplar RootVisual.


Not: Bu beklediğim gibi HTML Canvas gibi değil. Doğrudan çizim için değildir, ancak mutlak bir konumlandırma bağlamı sağlar (genellikle doğrudan şekilleri yerleştirirsiniz).
Paul

73

Robert Rossney'in iyi bir çözümü var. İşte geçmişte kullandığım "Yer Paylaşımını" içeriğin geri kalanından ayıran alternatif bir çözüm. Bu çözüm Panel.ZIndex, "Bindirme" yi diğer her şeyin üstüne yerleştirmek için ekli özellikten yararlanır. Koddaki "Kaplama" nın Görünürlüğünü ayarlayabilir veya a kullanabilirsiniz 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>

Bu kaplama yalnızca belirli bir alanı değil, tüm pencereyi kaplayacaktır.
Metro Şirin,

Şimdiye kadarki en iyi çözüm! Teşekkür ederim!
Geliştirici

Tam olarak ne tüm uygulama penceresi (örneğin kullanıcı masasından uzaklaşırsa hassas bilgileri gizlemek için) üzerinde bir "gizlilik ekranı" koymak için gereken, çok az kod ile. Müthiş!
Whitzz

40

Bir Izgara'nın aynı hücresindeki kontroller arka arkaya yapılır. Yani bir kontrolü diğerinin üzerine koymanın basit bir yolu onu aynı hücreye koymaktır.

Uzun süren bir görev yürütülürken (ör. BusyMessageBound özelliği null değilken) görünümdeki her şeyi (yani kullanıcı denetimi) meşgul iletiyle devre dışı bırakan bir paneli açan kullanışlı bir örnek :

<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

Getirmek istediğiniz denetimi xaml kodunuzun sonuna koyun. yani

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

13

Bu, WPF'deki Adorners'ın ortak bir işlevidir . Süsleyiciler tipik olarak diğer tüm kontrollerin üzerinde görünür, ancak z-sırasından bahseden diğer cevaplar davanıza daha uygun olabilir.


3
<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.