9

我在这样的 ScrollViewer 中创建了一个 Rectangle

<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 的大小会发生变化,有时会变为 3,000 像素左右的宽度。

musicBG.Width = _songLength*PixelsPerSecond

但是,在滚动 scrollViewer 时,它允许我将矩形一直滚动到屏幕外。

例如,当我将矩形移动到想要移动的距离时,这行代码给了我以下值。

if (songScrollViewer.HorizontalOffset > songScrollViewer.ScrollableWidth)

Horizo​​ntalOffset 的值约为 1200,而 ScrollableWidth 的值约为 2900。

如何才能正确完成此操作,以使矩形不会完全滚出屏幕?

我希望大约 1200 的 Horizo​​ntalOffset 只会将矩形推到它的目的地的一半左右,而不是让它开始离开屏幕。

回答:

经过一番挫折,我能够通过使用 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 秒。 好卷轴

4

1 回答 1

1

我相信你的权利,wp7 不会渲染大于 2048 像素的形状。所以它滚动页面的原因是因为它把它当作大于 2048 来对待,但你只能看到 2048px 的宽度,它只是滚动到矩形的“幽灵”部分。

我不确定你是否可以覆盖它,但我能想出的最好的解决方案(不覆盖)是将你的矩形分成小于 2000 的夹头(为了安全起见),然后在水平方向上无缝显示它们滚动查看器内的堆栈面板。问题在于,根据您的编码方式,该解决方案可能难以实施;但是您可能只能在显示时将其拆分到 ViewModel 中,并且您的逻辑只会将其视为一大块。

于 2012-06-27T00:20:30.073 回答