我在尝试使其正常工作时遇到了很多麻烦,并希望有人可以提供帮助。
我的 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)
任何帮助将不胜感激。谢谢!
(作为替代方案,是否有人已经在我可以使用的可重用控件中制作了这种“选择框”,而不是试图重新发明它?)