Если вашим элементам ListView не требуется взаимодействие с мышью или клавиатурой, вы можете просто поместить прямоугольник с помощью визуальной кисти справа от него:
<DockPanel Name="marqueeListTwice">
<ListView Name="marqueeList" .../>
<Rectangle Height="{Binding RenderHeight,ElementName=marqueeList}"
Width="{Binding RenderWidth,ElementName=marqueeList}">
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=marqueeList}" />
</Rectangle.Fill>
</Rectangle>
</DockPanel>
Теперь эта DockPanel будет иметь две параллельные копии ListView: одна слева - настоящая, а справа - прямоугольник, нарисованный с его изображением. Механизм рисования VisualBrush «совершенен» в том смысле, что вы не можете отличить нарисованную копию от реальной вещи.
Теперь вы можете анимировать элемент управления «marqueeListTwice» по всему холсту на расстояние marqueeList.ActualWidth. Когда вы дойдете до конца, вы увидите, что смотрите на первый предмет, но на самом деле вы будете смотреть на изображение, нарисованное на прямоугольнике. Когда вы вернетесь к 0, «реальный» первый элемент снова будет виден, но, поскольку он визуально идентичен, вы не получите столько мерцания.
Если вам нужно, чтобы отдельные элементы взаимодействовали с мышью во время панорамирования, это решение не будет работать, потому что закрашенный прямоугольник не будет реагировать должным образом: вам понадобится логика для перемещения отдельных элементов вместо перемещения ListView, содержащего все они. Вы все еще можете использовать анимацию, чтобы сделать это: просто анимируйте свойство вашего контейнера Window или UserControl и используйте его для расчета позиционирования вашего элемента.