2012-08-10 56 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