2010-06-17 3 views
1

Я использую горизонтальный список в списке шатра. Который продолжает двигаться справа налево.Как удалить пустое место из первого элемента списка и последнего элемента?

Мой код:

 double height = canMain.ActualHeight - marqueeList.ActualHeight; 
     marqueeList.Margin = new Thickness(0, 0, 0, 0); 
     doubleAnimation.From = -marqueeList.ActualWidth; 
     doubleAnimation.To = canMain.ActualWidth; 
     doubleAnimation.RepeatBehavior = RepeatBehavior.Forever; 
     doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds)); 
     Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Right)")); 
     _storyBoard.Children.Add(doubleAnimation); 
     _storyBoard.Begin(marqueeList, true) 

Но как только он полностью переместить есть пустое пространство не придет, пока снова первый элемент не придет. Я хочу удалить пробел между первыми товарами до последнего элемента. (Как circullar)

Пожалуйста, помогите мне в этом ... его срочном !!!

ответ

2

Если элементы 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 и используйте это, чтобы вычислить позиционирование вашего позиционирования.

+0

Спасибо за ур ответ! но мне нужно использовать мышь в списке marquee, так что нет другого способа добиться этого? –

+0

Да. Как я упоминаю в последнем абзаце, вы можете использовать свою собственную логику для слайд-элементов именно там, где вы хотите, вместо того, чтобы использовать ListView для этого. Я бы сделал это с помощью настраиваемого подкласса Panel. Пользовательская панель будет иметь свойство «Смещение», которое может рассчитывать от 0 до 1 или от 0 до ItemCount. Это свойство будет иметь флаг InvalidatesArrange. Затем в ArrangeOverride вы будете вычислять местоположения всех детей, используя значение смещения, размеры детей и т. Д. Детали этого расчета зависят от ваших конкретных потребностей. –

+0

Чтобы получить привязку данных для работы с пользовательской панелью, вы можете продолжать использовать ListView и устанавливать его свойство ItemsPanel в ItemsPanelTemplate, который содержит экземпляр класса вашей панели, с обязательным связыванием свойства Offset. Затем просто анимируйте свойство, с которым связано это смещение, что приведет к обновлению свойства Offset и ArrangeOverride для пересчета позиций. –

Смежные вопросы