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 是一个画布。画布始终具有高度 = 0 和宽度 = 0。放置在画布中的项目可以更大,但仍在画布内。滚动查看器只有画布的高度作为它应该能够滚动多少的想法。您可以通过临时设置画布的高度来轻松测试:

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

你会看到,现在你可以滚动了。

不幸的是,我现在想不出解决方案。(也许itemsControl通过计算显示所有项目所需的宽度和高度来设置通过代码的宽度和高度,将(Top + Side)的最高值作为Height和(Left + Side)的最高值Width

原来的:

你的 ContentPanelGrid有这个Height="Auto"。因此,ContentPanel 与 ScrollViewer 的高度相同,并且它的所有内容以及您仍然可以执行的实际滚动只是 ScrollViewer 在滚动能力结束时的弹跳效果。

只需删除Height="Auto",你应该没问题。

于 2013-06-26T10:49:06.317 回答