Почему ZIndex не учитывается при переопределении стека - PullRequest
0 голосов
/ 28 января 2011

Вот что я пытался сделать:

  1. Добавил панель стека в мое окно (Ориентация: Горизонтальная)
  2. Добавил набор кнопок к нему
  3. Установите ZIndex первой кнопки выше, чем вторая
  4. Увеличена ширина первой кнопки

То, что я ожидал:

  1. Я ожидал, что первая кнопка будет сверху второй кнопки (самое позднее наложение)
  2. Ширина StackPanel не должна изменяться, если ширина первой кнопки больше не является достаточной

Что происходит на самом деле:

  1. Ширина первой кнопки увеличивается, а вторая соответственно перемещается вправо.Они остаются в одной плоскости
  2. Ширина StackPanel увеличивается с увеличением ширины первой кнопки

Вот мой вопрос:

Я знаюэта стековая панель не учитывала ZIndex при размещении элементов внутри себя, НО ПОЧЕМУ?Разве он не должен учитывать ZIndex своих детей при их организации ???

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Stackpanel «укладывает» свои дочерние элементы на основе их ширины, то есть, если вы увеличиваете ширину элемента (или увеличиваете его поле), стековая панель просто расширяется, чтобы приспособиться к этому. Если вы хотите, чтобы элементы внутри стековой панели перекрывались, вам придется изменить их расположение после того, как макет был рассчитан. Вы можете выполнить это с помощью RenderTransform. Смотрите пример ниже:

<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
  <Button Content="One" Canvas.ZIndex="10">
    <Button.RenderTransform>
      <TranslateTransform X="10"/>
    </Button.RenderTransform>
  </Button>
  <Button Content="One"/>
  <Button Content="One"/>
  <Button Content="One"/>
</StackPanel>

И да, ZIndex уважают. Это прикрепленная proepry для Canvas, однако, похоже, что она используется движком рендеринга напрямую, а не Canvas, поэтому работает в приведенном выше коде.

0 голосов
/ 10 апреля 2013

Я попытался найти соответствующую информацию о том, как установить z-индекс элементов макета wpf и панелей.Использование Canvas связано с другим набором проблем позиционирования, которые у меня просто не было времени исследовать.Вот простое решение с использованием свойства Panel.ZIndex в xaml.

<Grid>
 <Border Width="100" Height="100" Margin="0,0,50,50" Panel.ZIndex="1" Background="Navy" Opacity="0.3"
    VerticalAlignment="Top" HorizontalAlignment="Left">
 </Border>
 <Border Width="100" Height="100" Margin="50,50,0,0" Background="Fuchsia" Opacity="0.3">
 </Border>

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

Вот тот же код, адаптированный к проблеме кнопки:

<Grid>
  <StackPanel  Panel.ZIndex="10" Margin="20,20,0,0" HorizontalAlignment="Left">
     <Button Content="One" Width="50" Height="40">
     </Button>
   </StackPanel>
 <StackPanel Orientation="Horizontal"  Margin="50,0,0,0" >
     <Button Content="Two" Width="50"  Height="40"/>
     <Button Content="Three" Width="50"  Height="40"/>
     <Button Content="Four" Width="50"  Height="40"/>
  </StackPanel>
</Grid>
...