Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Визуальное дерево GridViewRowPresenter 
:(
    Опции темы
Imir
Дата 29.11.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.10.2008

Репутация: 1
Всего: 1



Добрый день!

Задача и проблема в следующем:

Программирую специализированный TreeListView (опишу только необходимый минимум) у которого необходимо зафиксировать заголовок от вертикального скрола, а первую левую колонку от горизонтального скрола.
Для заголовка использую GridViewColumnCollection, для ячейки применяю DataTemplate.

Столбцы:
Код

 <GridViewColumnCollection x:Key="eShell.pExplorer.Header.Columns">
     <GridViewColumn Header=""                                                                   CellTemplate="{StaticResource eShell.dtctN0}" HeaderContainerStyle="{StaticResource eShell.pExplorer.Header.Columns[0]}" Width="19"/>
        <GridViewColumn Header="{x:Static res:Resources.peCellHeaderN1}" CellTemplate="{StaticResource eShell.dtctN1}" HeaderContainerStyle="{StaticResource eShell.pExplorer.Header.Columns[1]}"/>
        <GridViewColumn Header="{x:Static res:Resources.peCellHeaderN2}" CellTemplate="{StaticResource eShell.dtctN2}" HeaderContainerStyle="{StaticResource eShell.pExplorer.Header.Columns[2]}"/>
        <GridViewColumn Header="{x:Static res:Resources.peCellHeaderN3}" CellTemplate="{StaticResource eShell.dtctN3}" HeaderContainerStyle="{StaticResource eShell.pExplorer.Header.Columns[3]}"/>
    </GridViewColumnCollection>


Шаблон для крайнего левого столбца.
Код

 <DataTemplate x:Key="eShell.dtctN0">
        <SelectiveScrollingGrid x:Name="PART_eShell_pExplorer_Cell_Holder" SelectiveScrollingOrientation="Vertical">
              <!-- некоторые контролы -->
        </SelectiveScrollingGrid>        
</DataTemplate>


Стиль для крайнего левого заголовка.
Код

 <Style x:Key="eShell.pExplorer.Header.Columns[0]" TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource eShell.pExplorer.Header.Columns.Base}">
        <Setter Property="Margin" Value="0,0,-1,0"/>
        <Setter Property="Padding" Value="0,0,0,0"/>
        <Setter Property="Height" Value="20"/>
        <Setter Property="BorderThickness" Value="0,0,1,1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GridViewColumnHeader">
                 <SelectiveScrollingGrid SelectiveScrollingOrientation="None">
                     <Border Padding="0,3,0,4" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
                    </SelectiveScrollingGrid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


Чтобы зафиксировать заголовок использую Style для ScrollViewer в котором фиксирую заголовок от вертикального скрола помещая GridViewHeaderRowPresenter в ScrollViewer, а для скрола данных использую ScrollContentPresenter.
Для того, чтобы зафиксировать крайний столбец от горизонтального скрола применяю SelectiveScrollingGrid с требуемой ориентацией SelectiveScrollingOrientation. 

На этом можно сказать все сделано, но со следующей проблемой:
При горизонтальном скроле фиксированный столбец остается на месте, но правые от него начинают его перекрывать, то есть не под него заезжают а на него. Кстати, заголовок ведет себя именно так как нужно, то есть все правые заголовки скролятся под него, что мне и нужно (смотрите прикрепленный рисунок). Но как быть с ячейками данных?

Для решения этой задачи как я понимаю, для визуального дерева нужно задать ZIndex каждой ячейки строки  GridViewHeaderRowPresenter. Но дело в том, что GridViewHeaderRowPresenter создает визуальное дерево в котором все котролы из DataTemplate помещает в ContentPresenter, а как я понял ZIndex влияет на все котролы в рамках родителя.
Чтобы каждому  ContentPresenter (а у меня их 4-ре по числу столбцов) выставить необходимый ZIndex, создал наследник от GridViewRowPresenter в котором перегрузил метод OnVisualChildrenChanged. 
То есть я обрабатываю события добавления нового чилда в визуальное дерево. Затем я выполняю поиск своего контрола с именем PART_eShell_pExplorer_Cell_Holder и если нахожу то у его ContentPresenter повышаю ZIndex. 

Код

        protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
        {
            base.OnVisualChildrenChanged(visualAdded, visualRemoved);
            if (visualAdded != null && visualAdded is ContentPresenter)
            {
                ContentPresenter content = visualAdded as ContentPresenter;
                content.Margin = new Thickness(this.Margin.Left,this.Margin.Top,this.Margin.Right,this.Margin.Bottom);
                content.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
                content.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;

                content.ApplyTemplate();
                DataTemplate dt = content.ContentTemplate;
                if (dt != null)
                {
                    FrameworkElement obj = content.ContentTemplate.FindName("PART_eShell_pExplorer_Cell_Holder", content) as FrameworkElement;
                    if (obj != null)
                    {
                        Panel.SetZIndex(content, 1);
                    }
                    else Panel.SetZIndex(content, -1);
                }

            }
        base.OnVisualChildrenChanged(visualAdded, visualRemoved);
        }


Но этот метод не помогает в отладчике я просматриваю визуальное дерево и вижу, что у необходимых мне ContentPresenter ZIndex именно тот, что я выставил. Но порядок этих ContentPresenter в этом визуальном дереве не изменили свое положение, они по прежнему в том порядке в котором указаны столбцы в GridViewColumnCollection. Если к примеру сравнивать заголовки, то они в визуальном дереве расположены в обратной последовательности, из-за чего как я понимаю заголовок ведет себя именно так как я хочу. 
То есть все мои действия четны. Визуальное дерево для GridViewRowPresenter не хочет изменятся и ZIndex не помогает. Как мне быть в этом случае? 
(Для вложенных котролах в ContentPresenter, если я меняю ZIndex, то он влияет на их расположение в визуальном дереве). 


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  003.JPG 8,59 Kb
PM MAIL   Вверх
Gvozdin
Дата 29.11.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Ниасилил smile

Тут уж сразу бы готовый пример в студию. Или могу предложить свою реализацию TreeListView.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Imir
Дата 29.11.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.10.2008

Репутация: 1
Всего: 1



В том, то и дело, что проблема не в написании TreeListView а в том, что проблема в неверном поведении колонок при сокролировании в том случае если один из столбцов зафиксировать при помощи SelectiveScrollingGrid.
PM MAIL   Вверх
Gvozdin
Дата 30.11.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Создайте проект минимальный воспроизводящий ситуацию.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Imir
Дата 30.11.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.10.2008

Репутация: 1
Всего: 1



Цитата(Gvozdin @ 30.11.2011,  13:36)
Создайте проект минимальный воспроизводящий ситуацию.

В прикрепленном файле XAML окна в котором описан компонент с фиксированной колонкой. На DataBinding внимание не обращайте.

Чтобы увидеть проблему, необходимо растянуть заголовок любой колонки, чтобы появился горизонтальный скрол и при прокрутки, видно как крайняя левая колонка фиксирована от перемещения, а правые от нее перекрывают ее.

Это сообщение отредактировал(а) Imir - 30.11.2011, 14:50

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  MainWindow.zip 1,85 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.