我想将我在WPF中编写的控件转换为Windows Phone的Silverlight。我学到了很多东西,并对这两个版本进行了相当多的改进,但我似乎无法将ScrollViewer从Silverlight版本的ListBox中移出。这似乎从一开始就非常简单:列表框儿童数为0
ScrollViewer s = VisualTreeHelper.GetChild(List, 0) as ScrollViewer;
然而,当我到达这条线,我得到一个IndexOutOfRangeException--显然,根据VisualTreeHelper,我的列表框有没有视觉的孩子。
因为我感觉这是一个特殊的情况下,这是我的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。
啊,我不认为这一切必然是我想做的事情(比如,我不想隐瞒什么,我想获得对操控到的ScrollViewer参考它的滚动值),但我相信你确定了主要问题,这是我如何更改列表框的ItemsPanel。我记得使用你之前展示的方法;我不确定为什么我这次没有这样做。我将在更改后报告。 – 2012-08-10 14:35:51
好吧,它似乎已经工作 - 或者至少它部署了,尽管它不像WPF中那样工作,但这是我可以继续诊断的东西。您的更改工作得很好。我遇到的主要问题之一是我的StackPanel上仍然有“IsItemsHost”属性,这在Silverlight中不存在...由于某些原因,Intellisense没有收到它,所以我得到了“未指定的错误”异常令人困惑。谢谢你的帮助。 – 2012-08-10 15:07:20