在Windows 8 Metro应用程序中,是否可以创建一个ScrollViewer,该ScrollViewer在到达 View 中的最后一项时会循环回到 View 中的第一项?如果是这样,我怎么能达到这种效果?
最佳答案
绝对有可能。我目前正在解决问题,完成后将发布工作。到目前为止,它像下面这样。
这个想法是,您可以陷入滚动查看器的viewchanged事件,该事件在您移动栏时会触发。到达那里后,计算偏移量和项目大小的位置,然后可以使用该值来衡量列表框容器的实际大小或您拥有的大小。
一旦知道了偏移量的位置并知道了列表框的实际高度和项目的高度,便知道哪些项目当前可见,哪些不可见。确保绑定(bind)到该对象的列表是一个可观察到的集合,该实现使用双向绑定(bind)实现了INotifyChanged接口(interface)。然后,您可以定义一组对象以根据您在滚动中的位置来回旋转。
另一个选择是尝试一个不同的起点,也许是一个带有选框和滚动条的控件?
XAML
</UserControl.Resources>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="ScrollViewer1">
<ListBox x:Name="SampleListBox" Background="White" ItemsSource="{Binding Path=sampleItems}" ItemTemplate="{StaticResource sampleTemplate}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="0" Grid.RowSpan="2">
</ListBox>
</ScrollViewer>
</Grid>
背后的代码
public sealed partial class MainPage : Page
{
List<SampleItem> sampleItems;
const int numItems = 15;
public MainPage()
{
sampleItems = new List<SampleItem>();
for (int i = 0; i < numItems; i++)
{
sampleItems.Add(new SampleItem(i));
}
this.InitializeComponent();
SampleListBox.ItemsSource = sampleItems;
ScrollViewer1.ViewChanged += ScrollViewer1_ViewChanged;
}
void ScrollViewer1_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
ScrollViewer viewer = sender as ScrollViewer;
ListBox box = viewer.Content as ListBox;
ListBoxItem lbi = box.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
double elementSize;
if (lbi == null)
return;
elementSize = lbi.ActualHeight;
} /// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
public class SampleItem
{
public String ItemCount { get; set; }
public SampleItem(int itemCount)
{
ItemCount = itemCount.ToString();
}
}
关于c++ - 如何在Windows 8 Metro(C++/XAML)中制作循环/圆形ScrollViewer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11344545/