2

我遇到了 ListView 的一个非常奇怪的“功能”。希望有人可以在这里帮助我。

当您在 Window 上创建 ListView 时,它在边框和内容之间具有默认间距。如果您查看 Snoop 信息,我猜它是 2(左右)的填充。ListBoxChrome(ListView 的一部分)在我的例子中是 363px 宽。里面的 ScrollViewer 是 359px。这两个控件都没有设置任何内容。即使是一个简单 ListView 的新项目也有这个问题。

一种解决方法是给标题单元格填充 -2,但由于某种原因,标题直到右侧才会填充,并在右侧留出更宽的间隙。

有人来帮我吗?

一些截图:

http://i.imgur.com/AKbDfwQ.png

http://i.imgur.com/pQtqMJ4.png

4

1 回答 1

0

它是元素和元素的组合(BorderThickness每个元素贡献 2px。从左到右 1px)。PaddingBorder

你可以设置

<ListView BorderThickness="0">

和宽松的 2px,但Padding至少在 Windows-8 上直接设置Border在默认模板中的控件上,如果直接设置在ListView

从默认Style中提取ListView

<ControlTemplate TargetType="{x:Type ListView}">
  <Border x:Name="Bd"
          Background="{TemplateBinding Background}"
          BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}"
          Padding="1"
          SnapsToDevicePixels="true">

最简单的选项是提供一个自定义Style,您可以将该Padding值调整为 0。您还可以选择使用 Behavior 并获取对 Border 控件的引用并覆盖代码中的填充。

如果您选择代码隐藏选项来覆盖Padding设置填充的非常粗略的方法,则可能如下:

public MainWindow()
{
  InitializeComponent();
  Loaded += (sender, args) => {
    var border = (Border)lv.Template.FindName("Bd", lv);
    border.Padding = new Thickness(0);
  };
}

和你的xml:

<ListView x:Name="lv"
          BorderThickness="0">
于 2013-07-24T11:29:42.360 回答