Я создал прямоугольник внутри 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>
Изображение плохого прокрутки с неверным кодом:
Хороший рабочий код:
<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 секунд в плохом свитке.