2012-08-10 3 views
0

WPF로 작성한 컨트롤을 Windows Phone 용 Silverlight로 변환하려고합니다. 나는 많은 것을 배웠고 두 버전 모두 개선 된 점이 많았지 만 Silverlight 버전의 ListBox에서 ScrollViewer를 가져올 수없는 것 같습니다. 처음부터 아주 간단 보였다 :이 라인에 도달하면ListBox 하위 개수가 0입니다.

ScrollViewer s = VisualTreeHelper.GetChild(List, 0) as ScrollViewer; 

그러나, 나는 VisualTreeHelper에 따라, 명백하게 IndexOutOfRangeException--를 얻을, 내 목록 상자가 시각적 아이가 없습니다. 나는이 특별한 경우 인 느낌을 얻을 수 있기 때문에, 여기에 목록 상자의 내 XAML 선언은

입니다 :

나는 분명히 그 실버 라이트에서 읽기 전용 속성이 있기 때문에 바인딩 ContentTemplate을 주석했다
<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> 

? 이 문제를 해결하면 더 자세히 조사해야 할 것입니다.

나는 이것을 인터넷 검색으로 많이 찾을 수 없으며, 대부분의 사람들은 위의 방법을 사용하여 성공한 것으로 보인다. 그것은 확실히 WPF에서 작동합니다.

답변

1

당신의 목표가 단순히 ScrollViewer를 감추고 있다면, 당신은 이미 그 반쪽에 있습니다. 당신의 ScrollViewer가 이름을 가지고 있지 않기 때문에 ControlTemplate이 적용되지 않는

  1. : 당신은 단순히 당신의 목록 상자 다른 문제에 관해서는

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

    에서 다음 연결된 속성을 사용해야합니다. 이름은 "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에 대한 참조를 확보 할 스크롤 값의)하지만, 나는 ListBox의 ItemsPanel을 어떻게 변경했는지에 대한 주된 문제를 확인했다고 생각한다. 이전에 보여준 방법을 사용하는 것을 기억합니다. 나는 왜 내가 이번에 그것을하지 않았는지 잘 모르겠다. 나는 그것을 바꾼 후에 다시보고 할 것이다. –

+0

좋아요, WPF에서와 같이 작동하지 않지만 제대로 작동하거나 적어도 배포하는 것으로 보이지만 계속 진단 할 수 있습니다. 변경 사항이 잘 적용되었습니다. 내가 가진 주요 문제 중 하나는 Silverlight에 존재하지 않는 StackPanel의 "IsItemsHost"속성을 여전히 가지고 있다는 것이 었습니다. Intellisense가 그것을 잡아 내지 않았기 때문에 "Unspecified Error"예외가 발생했습니다. 혼란 스러웠습니다. 당신의 도움을 주셔서 감사합니다. –

관련 문제