WPF zIndex в TabControl - PullRequest
       34

WPF zIndex в TabControl

1 голос
/ 27 марта 2009

Я пытаюсь заставить zIndexing работать с пользовательским элементом управления UserControl, но он закрывает нижнюю часть элемента управления, когда он всплывает внутри TabControl, как показано ниже:

Demo of Control

Это мой XAML

<StackPanel Panel.ZIndex="1">
    <TabControl Name="TabCtrlMain" Panel.ZIndex="2">
        <TabItem Name="TabItmOrdrLst" Visibility="Collapsed" Panel.ZIndex="3" >
            <StackPanel Panel.ZIndex="4">
                <ri:OrderList x:Name="OrderList" Panel.ZIndex="5" />
                <Rectangle Fill="Orange" Height="80" Width="300" />
            </StackPanel>
        </TabItem>
    </TabControl>
    <Rectangle Fill="Blue" Height="80" Width="300" />
</StackPanel>

Ответы [ 3 ]

2 голосов
/ 27 марта 2009

Из изображения, которое вы разместили, выглядит, как будто пользовательский элемент управления имеет своего рода имитируемое всплывающее окно (панель «Примечания»), являющееся дочерним элементом элемента управления UserControl. Если это так, это может объяснить отсечение, если панель «Примечания» не является частью расчетов компоновки OrderList. Подумайте над тем, чтобы сделать элемент управления Notes истинным всплывающим окном или использовать что-то вроде Expander, который при раскрытии может сообщить своему родителю (UserControl), что ему требуется больше места для рендеринга.

Стоит отметить, что контейнеры, такие как StackPanel, всегда будут «складывать» свои дочерние элементы управления (отсюда и имя), что означает, что дочерние элементы управления никогда не будут перекрываться. По этой причине установка Z-индекса на любом из его дочерних элементов не имеет смысла. Я бы предложил использовать Grid или Canvas, так как вы хотите, чтобы контейнеры перекрывали элементы управления, а затем устанавливали их Z-индекс. Кроме того, помните, что Z-Index релевантен только в контексте непосредственного родителя элемента управления, поэтому предоставление всех элементов управления Panel.Zindex = "n", как в примере выше, не будет работать.

Из того, что я вижу, эта проблема - проблема макета, а не проблема Z-индекса.

2 голосов
/ 27 марта 2009

Из вашего примера неясно, что вы ожидаете от ZIndex. ZIndex влияет только на относительное размещение элементов в одном и том же контейнере, поэтому ни одна из настроек ZIndex, которые вы используете в своем примере, не будет иметь никакого эффекта. OrderList будет обрезан TabItem независимо от относительных значений ZIndex между ним и любым из его дочерних элементов.

1 голос
/ 27 марта 2009

Возможно, вы хотите отключить UserControl от StackPanel. То, что вы можете сделать, чтобы поиграть с размещением элементов в плоскости Z, это использовать Grid в качестве самого внешнего контейнера (если вы этого еще не сделали) и использовать это как руководство для размещения ваших элементов. Поскольку элементы в сетке могут занимать одно и то же пространство и располагаться в z-порядке в соответствии с порядком, в котором они объявлены, вы можете получить требуемую функциональность.

Не уверен, подходит ли это тому, что вы пытаетесь сделать, но стоит попробовать. Элементы в контейнере будут обрезаны по границам их родительского контейнера, поэтому для выполнения того, что вы ищете, я бы подумал, что UserControl должен быть родственным элементом StackPanel, а не его дочерним элементом.

...