WPF: ScrollViewer на 4px меньше, чем ListView


Я наткнулся на очень странную "особенность" ListView. Надеюсь, кто-нибудь сможет мне помочь.

Когда вы создаете ListView в своем окне,он поставляется с интервалом по умолчанию между границей и содержимым. Я думаю, что это заполнение 2 (слева и справа), если вы посмотрите на информацию о Snoop. ListBoxChrome (часть ListView)в моем случае имеет ширину 363px. ScrollViewer внутри него-359px. На обоих этих пультах управления ничего не установлено. Даже новый проект с простым ListView имеет эту проблему.

Один обходной путь состоит в том, чтобы дать ячейкам заголовка заполнение -2, но по какой-то причине заголовки не заполняются до тех пор, пока справа не останется более широкий пробел справа.

Кто-то здесь, чтобы помочь мне?

Некоторые скриншоты:

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

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

1 2

1 ответ:

Это комбинация BorderThickness и Padding из элемента Border (каждый вклад в 2px. 1 пиксель 1 пиксель слева и справа).

Вы можете установить

<ListView BorderThickness="0">

И loose 2px, однако Padding по крайней мере в Windows-8 устанавливается непосредственно на элемент управления Border в шаблоне по умолчанию и не будет иметь никакого эффекта, если установить непосредственно на ListView

Извлечение из default Style for 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. Вы также можете использовать поведение и получить ссылку на пограничный контроль и переопределение заполнения в коде.

Если вы выберете опцию code-behind для переопределения Padding, очень грубый способ установить заполнение может быть следующим:

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

И ваш xaml:

<ListView x:Name="lv"
          BorderThickness="0">