0

WPFで作成したコントロールをSilverlightforWindowsPhoneに変換しようとしています。私は多くのことを学び、両方のバージョンに加えられた改善でかなり調整しましたが、SilverlightバージョンのListBoxからScrollViewerを取り出すことができないようです。それは最初からかなり単純に見えました:

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>

どうやらそれはSilverlightの読み取り専用プロパティなので、ContentTemplateバインディングをコメントアウトする必要がありましたか?これを片付け終わったら、もっと調査する必要があります。

私はこれをグーグルで検索することから多くを見つけることができません、他のほとんどの人々はある程度の成功のために上記の方法を使用しているようです。それは確かにWPFで動作します。

4

1 に答える 1

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>
    
于 2012-08-10T06:34:55.530 に答える