ScrollViewer / StackPanel构造中的DataBound ListBox和Button,Button出现在ListBox内容的末尾

时间:2010-08-27 07:08:30

标签: .net silverlight visual-studio-2010 windows-phone-7

我有以下构造,它在StackPanel中显示一个DataBound ListBox和一个Button,它再次放在ScrollViewer中:

    <ScrollViewer VerticalScrollBarVisibility="Visible"
                  Height="400">
        <StackPanel Orientation="Vertical"
                    MaxHeight="400">
            <ListBox x:Name="LbTelEntries"
                     SelectionChanged="LbTelEntries_SelectionChanged"
                     MaxHeight="340"
                     VerticalAlignment="Top"
                     ItemsSource="{Binding Path=TelItems}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Templates:ListBoxItemTemplateSelector Content="{Binding}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button x:Name="BtMoreTelEntries"
                    Content="More Results"
                    Click="BtMoreTelEntries_Click"
                    Visibility="{Binding Path=NumberRemainingResults, Converter={StaticResource NullToVisConverter}}"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Bottom"
                    Height="70"
                    Width="410"
                    Margin="0 0 0 0"
                    ></Button>
        </StackPanel>
    </ScrollViewer>

我的问题是,当ListBox滚动到最后时,Button才会出现。单击Button后,将交换ListBox的内容,Button应再次移动到ListBox的末尾...

我将如何做到这一点?

编辑: 我应该提一下,我也在实现一个ItemTemplate。见下文:

<DataTemplate x:Key="ListBoxItemVmTemplate">
    <Grid DataContext="{Binding}">
        <StackPanel Orientation="Horizontal">
            <Border x:Name="UpperListBoxTemplateBorder"
                    Height="42"
                    Width="44"
                    BorderBrush="White"
                    BorderThickness="2.5"
                    CornerRadius="100"
                    Margin="10,16,0,0"
                    VerticalAlignment="Top">
                <Path x:Name="DataTemplatePath"
                      Height="16"
                      Width="11"
                      Fill="White"
                      Stretch="Fill"
                      Margin="4,0,0,0"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center"
                      UseLayoutRounding="False"
                      Data="M337.59924,129.61948 L337.59924,141.51501 L345.5704,135.87381 z" />
            </Border>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"></RowDefinition>
                    <RowDefinition Height="22"></RowDefinition>
                </Grid.RowDefinitions>
                <StackPanel Orientation="Horizontal"
                            Grid.Row="0">
                    <Controls:EllipsisTextBlock Text="{Binding DataModel.Title}"
                                                MaxWidth="410"
                                                Margin="18 12 0 0" />
                </StackPanel>
                <StackPanel Orientation="Horizontal"
                            Grid.Row="1">
                    <Controls:EllipsisTextBlock Text="{Binding DataModel.Street}"
                                                FontSize="16"
                                                MaxWidth="410"
                                                Margin="18 -3 0 0" />
                    <Controls:EllipsisTextBlock Text="{Binding DataModel.ZipCode}"
                                                FontSize="16"
                                                MaxWidth="410"
                                                Margin="18 -3 0 0" />
                    <Controls:EllipsisTextBlock Text="{Binding DataModel.City}"
                                                FontSize="16"
                                                MaxWidth="410"
                                                Margin="18 -3 0 0" />
                </StackPanel>
            </Grid>
        </StackPanel>
    </Grid>
</DataTemplate>

5 个答案:

答案 0 :(得分:1)

有一篇关于检测列表中最后一项何时滚动到http://blog.slimcode.com/2010/09/11/detect-when-a-listbox-scrolls-to-its-end-wp7/

的视频的博文

您可以使用此技术动态添加按钮到屏幕吗? 如果需要,可以在滚动列表时再次将其删除。

只是一个想法。

答案 1 :(得分:0)

我不完全理解你的问题,但我看到错误的是你把一个堆叠面板放在一个滚动查看器中,但是你使用了很多固定(最大)的高度,所以滚动查看器已经没有任何意义了。

尝试从Stackpanel和列表框中删除height属性,看它是否符合您的要求。

答案 2 :(得分:0)

似乎无法实现我的想法。目前的解决方案是:

<ScrollViewer VerticalScrollBarVisibility="Visible">
    <StackPanel Orientation="Vertical">
        <ListBox x:Name="LbTelEntries"
                 SelectionChanged="LbTelEntries_SelectionChanged"
                 MaxHeight="340"
                 VerticalAlignment="Top"
                 ItemsSource="{Binding Path=TelItems}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Templates:ListBoxItemTemplateSelector Content="{Binding}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button x:Name="BtMoreTelEntries"
                Content="More Results"
                Click="BtMoreTelEntries_Click"
                Visibility="{Binding Path=NumberRemainingResults, Converter={StaticResource NullToVisConverter}}"
                HorizontalAlignment="Center"
                VerticalAlignment="Bottom"
                Height="70"
                Width="410"
                Margin="0 0 0 0"
                ></Button>
    </StackPanel>
</ScrollViewer>

有了这个,我会永久地看到ListBox下方的Button。单击Button后,ListBox的内容将被扩展。据我所知,如果ListBox已滚动到最终,则无法检查...

答案 3 :(得分:0)

您应该删除在ListBox的template中隐式使用的ScrollViewer,如下所示:

<ListBox ...>
    <ListBox.Template>
        <ControlTemplate>
            <ItemsPresenter/>
        </ControlTemplate>
    </ListBox.Template>
    ...
</ListBox>

这将使ListBox控件尽可能高,以显示其所有元素,在ListBox的最后一项之后按下按钮。

请注意,如果列表中有大量项目,这可能会影响您的应用程序的性能。

正如Wouter所建议的,您还应该从StackPanel和ListBox中删除MaxHeight属性,因为您想要的唯一高度限制是顶级ScrollViewer上的高度限制。

答案 4 :(得分:0)

Baba演示了如何在ListBox控件模板中使用ItemsPresenter和Button来完成此答案中列表末尾的“更多”按钮:

http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/cdf2716d-0ceb-4c03-9e26-cbe9f53328d8