WPF ListView在内部布局面板周围有一个像素边框。我怎么摆脱它?

时间:2010-06-20 17:44:02

标签: wpf listview border

我有一个类似这样的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

如果我将ListView上的填充更改为-1,它会删除边框但会导致其他一些问题。

我希望避免重复整个ListView。其他一切都很好。有没有办法可以通过样式删除这个像素边框?

4 个答案:

答案 0 :(得分:9)

这很简单,如果你有混合你可以右键单击列表视图并选择编辑模板并从边框中删除填充。您可以直接在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}"  />

答案 1 :(得分:5)

快速而肮脏的解决方案(强调&#34;脏&#34;):

<ListView Padding="-1" />

答案 2 :(得分:4)

对我来说最简单的解决方案是将Border的厚度设置为0,如:

<ListBox BorderThickness="0" />

无需模板......

答案 3 :(得分:2)

我刚看了ListView的默认模板,实际上Border的显式填充为1 ...所以我认为如果不重新定义模板就不能这样做。无论如何,这并不是很困难:只需使用StyleSnooper或ShowMeTheTemplate这样的工具复制默认模板(我想Blend也可以这样做),并改变你需要的东西......