Как сделать управление наложением выше всех других элементов управления? - программирование
Подтвердить что ты не робот

Как сделать управление наложением выше всех других элементов управления?

Мне нужно сделать элемент управления выше всех остальных элементов управления, поэтому он будет частично перекрывать их.

4b9b3361

Ответ 1

Если вы используете холст или сетку в своем макете, дайте элементу управления поставить поверх более высокого значения 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.

Ответ 2

Роберт Россни имеет хорошее решение. Здесь альтернативное решение, которое я использовал в прошлом, отделяет "Overlay" от остальной части контента. Это решение использует преимущества прилагаемого свойства 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>

Ответ 3

Элементы управления в одной и той же ячейке сетки отображаются обратно. Таким образом, простой способ поставить один элемент управления поверх другого - это поместить его в одну ячейку.

Вот полезный пример, который выдает панель, которая отключает все в представлении (то есть пользовательский элемент управления) с сообщением "занято", когда выполняется долговременная задача (т.е. когда свойство привязки BusyMessage не равно нулю) ):

<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>

Ответ 4

Поместите элемент управления, который вы хотите перенести на передний план в конце кода xaml. То есть.

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

Ответ 5

Это общая функция Adorners в WPF. Надзиратели обычно появляются выше всех других элементов управления, но другие ответы, в которых упоминается z-порядок, могут лучше соответствовать вашему делу.

Ответ 6

<Canvas Panel.ZIndex="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="570">
  <!-- YOUR XAML CODE -->
</Canvas>