我正在尝试将我在WPF中编写的控件转换为Silverlight for Windows Phone。我已经学到了很多,并且对两个版本的改进进行了相当多的调整,但我似乎无法从Silverlight版本的ListBox中获取ScrollViewer。从一开始看起来很简单:
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。
答案 0 :(得分:1)
如果您的目标只是隐藏ScrollViewer,那么您已经到了一半。您只需在ListBox上使用以下附加属性
<ListBox ScrollViewer.VerticalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollBarVisibility="Hidden" >
...
至于你的其他问题:
由于您的ScrollViewer没有名称,因此未应用ControlTemplate。它必须命名为“ScrollViewer”。
您无法在ControlTemplate中显式设置ItemsPanel。相反,您必须提供ItemsPresenter,然后设置ListBox的ItemsPanel属性。
要为内容设置DataTemplate,必须在ListBox上设置ItemTemplate属性。
<ListBox Height="100" Margin="200,195,156,0"
VerticalAlignment="Top"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ItemContainerStyle="{StaticResource ListBoxItemStyle1}">
<ListBox.Style>
<Style TargetType="ListBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}">
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Style>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"
Margin="{Binding ActualWidth, ElementName=LayoutRoot, Converter={StaticResource Hc}}">
</VirtualizingStackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Border Width="100" Height="100" Background="White">
...
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>