Как заставить ScrollViewer с прямоугольником внутри останавливать прокрутку, когда он достигает конца прямоугольника?

Я создал прямоугольник внутри ScrollViewer, подобный этому

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer"  HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Center" Width="728" Canvas.Top="20" d:LayoutOverrides="HorizontalMargin"   >
  <Rectangle x:Name="musicBG" Fill="#FF0692FD"/>
</ScrollViewer>

Во время использования приложения размер MusicBg меняется, иногда примерно до 3000 пикселей в ширину.

musicBG.Width = _songLength*PixelsPerSecond

Однако при прокрутке scrollViewer он позволяет мне прокручивать прямоугольник полностью за пределы экрана.

Например, эта строка кода дает мне следующие значения, когда я перемещаю прямоугольник так далеко, как хочу.

if (songScrollViewer.HorizontalOffset > songScrollViewer.ScrollableWidth)

HorizontalOffset имеет значение ~1200, а ScrollableWidth имеет значение около ~2900.

Как сделать так, чтобы прямоугольник не прокручивался полностью за пределы экрана?

Я ожидаю, что HorizontalOffset, равный примерно 1200, только подтолкнет прямоугольник примерно на полпути к месту назначения и не заставит его начать исчезать с экрана.

ОТВЕТ:

После долгих разочарований я смог решить эту проблему, используя Canvas вместо Border или Rectangle. Я начислю баллы, если кто-нибудь сможет объяснить, почему возникла эта проблема, и если есть менее интенсивное управление процессором, которое будет работать лучше, чем холст.

Редактировать: Снимки экрана:

Плохой код:

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer" Width="720"  HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Top" Canvas.Top="20" HorizontalAlignment="Left"   >
                                    <Border x:Name="musicBG"   Background="#FF0692FD" VerticalAlignment="Top" HorizontalAlignment="Left" Height="270" />

            </ScrollViewer>

Изображение плохого прокрутки с неверным кодом: bad scroll

Хороший рабочий код:

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer" Width="720"  HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Top" Canvas.Top="20" HorizontalAlignment="Left"   >
                <Canvas x:Name="musicBG"  Background ="#FF0692FD" Height="270" >
                    <Border   Background="#FF0692FD" VerticalAlignment="Top" HorizontalAlignment="Left" Height="270" />
                </Canvas>
            </ScrollViewer>

Хороший свиток: обратите внимание, что в правом нижнем углу указано 170 секунд вместо меньшего числа 118 секунд в плохом свитке.good scroll

9
задан Bob 25 June 2012 в 22:30
поделиться