WPF ListView имеет границу в один пиксель вокруг внутренней панели макета. Как мне от этого избавиться? - PullRequest
7 голосов
/ 20 июня 2010

У меня есть ListView, который выглядит примерно так:

<ListView 
    x:Name="SeriesListView"
    SnapsToDevicePixels="True"
    ItemsSource="{Binding Items}"
    BorderBrush="Transparent" BorderThickness="0"
    Padding="0" Margin="0" 
    VerticalContentAlignment="Top"
    Background="Purple"
    LostFocus="ListView_LostFocus"
    >

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <local:LDSeriesPanel
                SnapsToDevicePixels="True" 
                MaxWidth="{Binding ElementName=itControl,Path=ActualWidth}"
                VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
                MinHeight="{x:Static local:LDSeriesPanel.MIN_HEIGHT}" 
                MinWidth="{x:Static local:LDSeriesPanel.MIN_WIDTH}"
                Margin="0"
                Background="Aquamarine"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

Когда он пуст, ширина и высота пользовательской панели, которую я определил, равна 15 x 15. Я могу подтвердить, что это фактическиеразмеры во время выполнения.Однако сам ListView имеет размеры 17 x 17 (то есть границу в один пиксель между панелью и ListView).

Начиная с пользовательской панели и поднимаясь по дереву, я получаю следующих предков:

  • ItemsPresenter: 15x15
  • ScrollViewer: 15x15
  • Сетка: 15x15
  • ScrollViewer: 15x15
  • Граница: 17x17
  • ListView: 17x17

Если я изменю Padding на ListView на -1, он удалит границу, но вызовет несколько других проблем.

Я надеюсь избежатьпереплетение всего ListView.Все остальное работает нормально.Можно ли как-нибудь удалить эту границу в один пиксель, возможно, с помощью стиля?

Ответы [ 4 ]

9 голосов
/ 01 февраля 2011

Это действительно просто, если у вас есть blend, вы можете щелкнуть правой кнопкой мыши по списку и выбрать редактирование шаблона и удаление отступов от границы. Вы можете сделать это прямо в xaml. Поскольку я хочу, чтобы у всех моих списков не было этой границы, я создаю файл ресурсов с именем MyprojectnameResources.xaml в корневом каталоге проекта с этим содержимым.

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTemplate x:Key="ListViewNewTemplate" TargetType="{x:Type ListBox}">
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="0" SnapsToDevicePixels="True">
        <ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}">
            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </ScrollViewer>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        </Trigger>
        <Trigger Property="IsGrouping" Value="True">
            <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<!-- Resource dictionary entries should be defined here. -->

Тогда вы можете просто использовать этот шаблон с любым списком, который хотите

<ListView Width="1020" Height="764" ItemsSource="{Binding Destinations}" ItemTemplate="{DynamicResource DestinationDataTemplate}"  Canvas.Top="0" Canvas.Left="0" BorderThickness="0" Template="{DynamicResource ListViewNewTemplate}"  />
5 голосов
/ 27 января 2015

Быстрое и грязное решение (акцент на «грязное»):

<ListView Padding="-1" />
4 голосов
/ 22 июня 2015

Самым простым решением для меня было установить толщину границы на 0, например:

<ListBox BorderThickness="0" />

Шаблоны не требуются ...

2 голосов
/ 21 июня 2010

Я только что посмотрел шаблон по умолчанию для ListView, действительно Border имеет явное заполнение 1 ... поэтому я не думаю, что вы можете сделать это без переопределения шаблона.В любом случае, это не очень сложно: просто скопируйте шаблон по умолчанию, используя такой инструмент, как StyleSnooper или ShowMeTheTemplate (я думаю, что Blend может сделать это тоже), и измените то, что вам нужно ...

...