我正在尝试将我在 WPF 中编写的控件转换为适用于 Windows Phone 的 Silverlight。我学到了很多东西,并通过对两个版本的改进对其进行了相当多的调整,但我似乎无法将 ScrollViewer 从 Silverlight 版本的 ListBox 中取出。从一开始它似乎很简单:
ScrollViewer s = VisualTreeHelper.GetChild(List, 0) as ScrollViewer;
然而,当我到达这条线时,我得到一个 IndexOutOfRangeException——显然,根据 VisualTreeHelper,我的 ListBox 没有可视子项。
因为我觉得这是一个特殊情况,所以这是我的 ListBox 的 XAML 声明:
<ListBox x:Name="List" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
ItemsSource="{Binding ItemsSource, ElementName=SnapListControl}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.Style>
<Style TargetType="ListBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<VirtualizingStackPanel Orientation="Horizontal" IsItemsHost="True"
Margin="{Binding ActualWidth, ElementName=LayoutRoot, Converter={StaticResource Hc}}">
</VirtualizingStackPanel>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Style>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="RenderTransformOrigin">
<Setter.Value>
<Point X="0.5" Y="0.5"/>
</Setter.Value>
</Setter>
<Setter Property="Padding" Value="0"/>
<!--<Setter Property="ContentTemplate" Value="{Binding ItemContentTemplate, ElementName=SnapListControl}"/>-->
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
我不得不注释掉 ContentTemplate 绑定,因为显然这是 Silverlight 中的只读属性?当我完成清理时,我将不得不对此进行更多调查。
我从谷歌搜索中找不到太多,大多数其他人似乎都使用上面的方法取得了一些成功。它当然适用于 WPF。