Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Как убрать пустую область слева и справа от заголовка ListView

#c_sharp #wpf #listview


При разработке обычных десктопных приложений (на WPF), никогда не обращал внимание
на специфическую отрисовку заголовка ListView.

Области выделены красным.



Но тут возникла необходимость делать дополнительное окно, на которое выводятся ListView
с 2-мя колонками.
С этого окна, захватывается изображение попиксельно, специальным устройством и отправляются
на светодиодные табло, и все мелкие детали там хорошо видны.


    




    
        
            
                
                    
                        
                            
                        
                    
                

                
                    
                        
                            
                        
                    
                
            
        
    


    


Ответы

Ответ 1



Как верно заметили в комментариях, отступы в заголовке составляют 3 пикселя, но добавлять отрицательный отступ к GridViewColumnHeader неправильно, т. к. этот отступ будет у каждого столбца (т.е. столбцы будут перекрывать друг друга), а нам нужно устранить только отступ слева и справа у всей строки заголовка. Покопавшись, с помощью встроенных в Visual Studio инструментов Live Visual Tree и Live Property Explorer, в визуальном дереве окна, я выяснил, что из этих трех пикселей два дает GridViewHeaderRowPresenter.Margin и один — ListBoxChrome.BorderThickness. С ListBoxChrome.BorderThickness всё просто — он привязан к BorderThickness родителя, т. е. самого ListView и устраняется просто в разметке или стиле: Также в Live Visual Tree видно, что GridViewHeaderRowPresenter лежит внутри ScrollViewer, открыв стандартный стиль ListView, можно найти только один ScrollViewer, у которого стиль задается вот так: Этот стиль можно найти в документации Microsoft здесь. В этом стиле внутри шаблона можно увидеть такой фрагмент:

Ответ 2



Заголовки GridView помещены в элемент GridViewHeaderRowPresenter, у которого в шаблоне по умолчанию задан Margin = 2 с правой и левой стороны. Можно обработать у Border заголовка событие Loaded и переопределить его: private void Border_Loaded(object sender, RoutedEventArgs e) { FrameworkElement p1 = (FrameworkElement)(((FrameworkElement)sender).TemplatedParent); // GridViewColumnHeader FrameworkElement p2 = (FrameworkElement)p1.Parent; // GridViewHeaderRowPresenter p2.Margin = new Thickness(0); }

Комментариев нет:

Отправить комментарий