我在努力实现这项工作时遇到了很多麻烦,希望有人可以提供帮助。
我的WindowsPhone应用程序中有一个ScrollViewer,我试图模仿你在原生日历应用程序中看到的“日期/时间选择器”的类似控件。所以我的ScrollViewer包含一个StackPanel,其中包含多个带有矩形和TextBlocks的方形画布。我的目的是观察“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)
非常感谢任何帮助。谢谢!
(作为替代方案,有没有人制作这种“选择框”已经处于可重复使用的控制中,我可以使用而不是试图重新发明它?)
答案 0 :(得分:0)
您是否等到滚动查看器已加载事件在尝试获取scrollviewer子项之前触发?