Я думаю, что для этого есть очень простой / старый метод, который поддерживается всеми браузерами даже IE 6/7. Мы могли бы просто установить letter-spacing
на большое отрицательное значение в родительском, а затем вернуть его к normal
в дочерние элементы:
body { font-size: 24px }
span { border: 1px solid #b0b0c0; } /* show borders to see spacing */
.no-spacing { letter-spacing: -1em; } /* could be a large negative value */
.no-spacing > * { letter-spacing: normal; } /* => back to normal spacing */
<p style="color:red">Wrong (default spacing):</p>
<div class="">
<span>Item-1</span>
<span>Item-2</span>
<span>Item-3</span>
</div>
<hr/>
<p style="color:green">Correct (no-spacing):</p>
<div class="no-spacing">
<span>Item-1</span>
<span>Item-2</span>
<span>Item-3</span>
</div>
Я думаю, что поведение, которое вы видите, связано с VirtualizingStackPanel.IsVirtualizing
по умолчанию True
при привязке к ItemsSource
из ListBox
, если вы, например, установите свой ListBox
, например:
<ListBox VirtualizingStackPanel.IsVirtualizing="False" SelectionMode="Extended" ItemsSource="{Binding DataContext.ResultList, RelativeSource={RelativeSource AncestorType=Window}}">
или
<ListBox ...>
...
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
, тогда вы должны увидеть, что все ваши связанные объекты имеют свои IsSelected
обновленные соответственно с помощью Ctrl + A или Shift + ...
Свойства, такие как Count
коллекции даже с виртуализацией, сообщают о правильном значении для размещения таких вещей, как вычисление требуемого ScrollBar.Height
. Элементы, которые находятся за пределами порта View, не отображаются, поэтому привязки к ним не действуют до тех пор, пока они не будут использованы.