2012-08-10 59 views
0

我想将我在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。

回答

1

如果您的目标只是为了隐藏ScrollViewer,您已经到了一半。你只需要在你的列表框

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

至于你的其他问题,请使用以下附加属性:

  1. 不被应用的控件模板,因为您的ScrollViewer没有一个名字。它必须命名为“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> 
    
+0

啊,我不认为这一切必然是我想做的事情(比如,我不想隐瞒什么,我想获得对操控到的ScrollViewer参考它的滚动值),但我相信你确定了主要问题,这是我如何更改列表框的ItemsPanel。我记得使用你之​​前展示的方法;我不确定为什么我这次没有这样做。我将在更改后报告。 – 2012-08-10 14:35:51

+0

好吧,它似乎已经工作 - 或者至少它部署了,尽管它不像WPF中那样工作,但这是我可以继续诊断的东西。您的更改工作得很好。我遇到的主要问题之一是我的StackPanel上仍然有“IsItemsHost”属性,这在Silverlight中不存在...由于某些原因,Intellisense没有收到它,所以我得到了“未指定的错误”异常令人困惑。谢谢你的帮助。 – 2012-08-10 15:07:20