1

動的に生成されるを追加しScrollViewerています。ItemsControlItemTemplate

問題は、ScrollViewerスクロール後にスナップが元の位置に戻ることです。十分な高さになるように嘘のあるグリッドコンテナGrid.Row="1"を設定ScrollViewerするか、自動に設定しようとしましたが、問題は解決しません。私は何が欠けていますか?

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel Grid.Row="0" Margin="12,17,0,28">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding GameLevel, Converter={StaticResource EnumToStringConverter}}" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock  HorizontalAlignment="Right" Grid.Column="1" Style="{StaticResource PhoneTextNormalStyle}">
                <Run Text="GAME "/>
                <Run Text="{Binding CurrentGame}"/>
                <Run Text=" / "/>
                <Run Text="{Binding TotalGame}"/>
            </TextBlock>
        </Grid>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle2Style}">
                <Run Text="{Binding CurrentTime, Converter={StaticResource SecondsToMinutesHour}}"/>   
            </TextBlock>
            <TextBlock Foreground="Green" HorizontalAlignment="Right" Grid.Column="1" Margin="9,-7,9,0" Style="{StaticResource PhoneTextTitle2Style}">
                <Run Text="{Binding TotalTime, Converter={StaticResource SecondsToMinutesHour}}"/>
            </TextBlock>

            <ProgressBar Grid.Row="1" Grid.ColumnSpan="2" x:Name="ProgressBar" Value="{Binding ProgressBarTime}" Minimum="0" Maximum="100" VerticalAlignment="Top" CacheMode="BitmapCache"/>
        </Grid>
    </StackPanel>

    <!--ContentPanel - place additional content here-->

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ScrollViewer>
        <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Tiles}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Tag="{Binding Index}" Loaded="FrameworkElement_OnLoaded">
                        <Button Width="{Binding Side}" 
                               Height="{Binding Side}" 
                               Background="{Binding BgColor}"                                   
                               Tag="{Binding Index}"
                            Content="{Binding Index}"
                            FontSize="{StaticResource PhoneFontSizeSmall}"
                               Click="Button_Click">

                            <ia:Interaction.Triggers>
                                <ia:EventTrigger EventName="Loaded">
                                    <tr:SetCanvasPropertiesAction Left="{Binding Left}" Top="{Binding Top}" />
                                </ia:EventTrigger>
                            </ia:Interaction.Triggers>                               
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        </ScrollViewer>         
    </Grid>

    <Grid x:Name="adGrid" Grid.Row="2" HorizontalAlignment="Center"/>
</Grid>

4

1 に答える 1

2

編集:わかりました、本当の問題は、ItemsPnaelTemplate が Canvas であることです。キャンバスの高さは常に 0 で、幅は 0 です。キャンバスに配置されたアイテムは大きくなる可能性がありますが、キャンバス内にあります。スクロールビューアには、スクロールできる量のアイデアとして、キャンバスの高さしかありません。キャンバスの高さを一時的に設定することで、これを簡単にテストできます。

<ItemsPanelTemplate>
   <Canvas Height="1500"/>
</ItemsPanelTemplate>

そして、スクロールできるようになったことがわかります。

残念ながら、今のところ解決策は思いつきません。(おそらく、itemsControlすべてのアイテムを表示するために必要な幅と高さを計算し、(Top + Side)Heightと (Left + Side) の値が最も高いアイテムを取得して、スルー コード ビハインドの幅と高さを設定しますWidth)

オリジナル:

あなたの ContentPanelGridにはこれがありHeight="Auto"ます。したがって、ContentPanel は ScrollViewer と同じ Height であり、そのすべてのコンテンツと、まだ実行できる実際のスクロールは、スクロール機能の最後に到達したときの ScrollViewer の跳ね返り効果です。

削除するだけHeight="Auto"で問題ありません。

于 2013-06-26T10:49:06.317 に答える