Элемент WPF вне Scrollviewer игнорирует ZIndex

Если у меня есть элемент, преобразованный за пределы средства просмотра прокрутки WPF, я не могу отобразить его сверху.

Рассмотрим следующий пример:

<Window x:Class="ScrollViewerContentTransform.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>

         <Grid.RowDefinitions>
             <RowDefinition/>
             <RowDefinition/>
         </Grid.RowDefinitions>

         <Border Grid.Row="0" Background="Blue" Panel.ZIndex="1"/>

         <ScrollViewer Grid.Row="1" Panel.ZIndex="2">
             <Grid>
                 <Border Width="30" Height="30" Background="Red">
                     <Border.RenderTransform>
                         <TranslateTransform Y="-80"/>
                     </Border.RenderTransform>
                 </Border>
             </Grid>
         </ScrollViewer>

    </Grid>
</Window>

Даже когда я устанавливаю zorder, красная рамка все равно будет скрыта под синей рамкой.

http://imm.io/Sm2Q

Если я заменю ScrollViewer сеткой, это будет отображаться по мере необходимости. Любые советы о том, как я могу заставить элемент отображаться сверху при использовании ScrollViewer?


person Erlend Såstad Solberg    schedule 10.01.2013    source источник
comment
Border, который у вас есть, находится в другой строке, поэтому он никогда не будет визуально перекрываться с ScrollViewer, если где-то в ваших шаблонах вы не установили ClipToBounds в значение false для строк сетки.   -  person Ameen    schedule 10.01.2013
comment
Если я поменяю Scrollviewer на Grid, я получу визуальный результат, который искал. Я бы предположил, что для ScrollViewer тоже есть решение.   -  person Erlend Såstad Solberg    schedule 10.01.2013


Ответы (1)


Насколько мне известно, при использовании ScrollViewer невозможно удалить отсечение содержимого, потому что шаблон элемента управления ScrollViewer будет генерировать ScrollContentPresenter, который, в свою очередь, имеет следующую реализацию метода GetLayoutClip:

protected override Geometry GetLayoutClip(Size layoutSlotSize) {
    return new RectangleGeometry(new Rect(base.RenderSize));
}

Это класс Sealed, поэтому вы не можете наследовать его, чтобы переопределить этот метод. Поэтому рассмотрите возможность удаления ScrollViewer из вашего макета.

person DmitryG    schedule 10.01.2013
comment
Спасибо DmitryG, я полагаю, вы правы. Мне придется найти обходной путь. - person Erlend Såstad Solberg; 11.01.2013