ListBox子计数为0

时间:2012-08-10 04:18:50

标签: silverlight windows-phone-7

我正在尝试将我在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。

1 个答案:

答案 0 :(得分:1)

如果您的目标只是隐藏ScrollViewer,那么您已经到了一半。您只需在ListBox上使用以下附加属性

<ListBox ScrollViewer.VerticalScrollBarVisibility="Hidden"
        ScrollViewer.HorizontalScrollBarVisibility="Hidden" >
...

至于你的其他问题:

  1. 由于您的ScrollViewer没有名称,因此未应用ControlTemplate。它必须命名为“ScrollViewer”。

  2. 您无法在ControlTemplate中显式设置ItemsPanel。相反,您必须提供ItemsPresenter,然后设置ListBox的ItemsPanel属性。

  3. 要为内容设置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>