1

我在尝试使其正常工作时遇到了很多麻烦,并希望有人可以提供帮助。

我的 WindowsPhone 应用程序中有一个 ScrollViewer,我正在尝试模拟与您在本机日历应用程序中看到的“日期/时间选择器”类似的控件。因此,我的 ScrollViewer 包含一个 StackPanel,其中包含多个带有矩形和 TextBlock 的方形画布。我的意图是观看“ScrollStates”,当 VisualState 更改为“NotScrolling”时,我会检查 ScrollViewer 的 VerticalOffset 并将幻灯片动画到最近的“snap-to”位置(即对齐正方形到正确/中间位置)。

<ScrollViewer Name="sv" Width="100" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Disabled" Loaded="ScrollViewer_Loaded">
    <StackPanel>
        <Canvas MaxWidth="77" MaxHeight="80" MinWidth="80" MinHeight="80" Margin="3">
            <Rectangle Stroke="{StaticResource PhoneForegroundBrush}" StrokeThickness="3" Width="80" Height="80" />
            <TextBlock Text="1" FontSize="36" FontWeight="Bold" TextAlignment="Center" HorizontalAlignment="Center" Width="70" Canvas.Left="6" Canvas.Top="14" LineHeight="48" />
        </Canvas>
        <Canvas MaxWidth="77" MaxHeight="80" MinWidth="80" MinHeight="80" Margin="3">
            <Rectangle Stroke="{StaticResource PhoneForegroundBrush}" StrokeThickness="3" Width="80" Height="80" />
            <TextBlock Text="2" FontSize="36" FontWeight="Bold" TextAlignment="Center" HorizontalAlignment="Center" Width="70" Canvas.Left="6" Canvas.Top="14" LineHeight="48" />
        </Canvas>
        <Canvas MaxWidth="77" MaxHeight="80" MinWidth="80" MinHeight="80" Margin="3">
            <Rectangle Stroke="{StaticResource PhoneForegroundBrush}" StrokeThickness="3" Width="80" Height="80" />
            <TextBlock Text="3" FontSize="36" FontWeight="Bold" TextAlignment="Center" HorizontalAlignment="Center" Width="70" Canvas.Left="6" Canvas.Top="14" LineHeight="48" />
        </Canvas>
        ...
    </StackPanel>
</ScrollViewer>

我一直在查看与 VisualStates 挂钩的各种示例,例如http://blogs.msdn.com/b/ptorr/archive/2010/07/23/how-to-detect-when-a-list-is -scrolling-or-not.aspx ; http://developingfor.net/2009/02/16/fun-with-the-wpf-scrollviewer/http://blogs.msdn.com/b/slmperf/archive/2011/06/30/windows-phone-mango-change-listbox-how-to-detect-compression-end-of-scroll-states.aspx。 ..似乎都有与此类似的代码:

// Visual States are always on the first child of the control template
FrameworkElement element = VisualTreeHelper.GetChild(sv, 0) as FrameworkElement; 

...然后继续寻找VisualStateGroup group = FindVisualState(element, "ScrollStates");,他们可以从中挂钩事件到它何时发生变化。

但是...每当我尝试执行此VisualTreeHelper.GetChild(sv,0) as FrameworkElement操作时,应用程序都会崩溃,并出现“System.ArgumentOutOfRangeException”类型的异常。如果我输出VisualTreeHelper.GetChildrenCount(sv),它总是“0”。它似乎对其他人有效?8)

任何帮助将不胜感激。谢谢!

(作为替代方案,是否有人已经在我可以使用的可重用控件中制作了这种“选择框”,而不是试图重新发明它?)

4

1 回答 1

0

您是否等到滚动查看器的 Loaded 事件触发后再尝试获取滚动查看器子项?

于 2012-11-13T22:41:54.920 回答