在Windows 8 Metro應用程序中,是否可以創建一個ScrollViewer,它在到達視圖中的最後一項時循環回第一個在視圖中的項目?如果是這樣,我該如何達到這個效果?如何在Windows 8 Metro(C++/XAML)中製作循環/循環滾動查看器
6
A
回答
1
我不相信在WinRT/XAML中有這樣的控件,所以你需要實現一個自定義控件。您可以採取多種方法,但我可能會避免使用ScrollViewer並直接處理操作事件,因爲將ScrollViewer的行爲摺疊到您的要求可能並不容易。我將根據操縱事件和基於滾動偏移來控制滾動偏移量 - 定位視圖中的元素 - 例如,使用Canvas控件。您需要根據滾動偏移量重新放置項目面板中的元素,以便例如將超出一端視口的項目移動到另一端。它會涉及到自定義的依賴屬性,項目容器等。如果你知道所有這些API,可能至少需要幾個小時的工作。
3
這絕對有可能。我現在正在解決問題,並在完成後發佈工作。到目前爲止,它如下所示。
這個想法是,你掛鉤到scrollchanged事件的滾動查看器,隨時移動欄會觸發。一旦出現,計算偏移量和項目大小,然後您可以使用它來測量您的列表框容器的實際大小或您有什麼。
一旦您知道了偏移的位置並知道列表框的實際高度和項目的高度,就知道哪些項目當前可見,哪些不是。確保綁定到對象的列表是一個可觀察的集合,它使用雙向綁定實現INotifyChanged接口。然後,您可以根據滾動的位置定義一組對象來回旋轉。
另一種選擇是嘗試不同的起點,也許是一個單選按鈕和一個滾動條下的控件?
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();
}
}
相關問題
- 1. 查看移動循環
- 2. 如何實現循環滾動機制?
- 3. 如何使Windows 8 Metro滾動查看器響應鼠標滾輪?
- 4. 循環內循環在Rails控制器
- 5. 如何在Windows Phone 8中停止panaroma項目的循環循環?
- 6. 嵌套循環器查看滾動發行
- 7. 如何在jmeter中的循環控制器中添加動態循環計數?
- 8. 如何製作ViewPager循環?
- 9. 如何製作循環ScrollView?
- 10. 如何製作For循環
- 11. 如何製作Jcoverflip循環?
- 12. 循環8次
- 13. 如何在Chrome中製作循環Div?
- 14. 如何在使用BitmapEncoder生成循環時製作GIF循環
- 15. 反轉循環滾動背景動作
- 16. 在Matlab中繪製循環For循環
- 17. Rails:查看循環重構
- 18. 如何在循環中創建循環(雙循環)
- 19. 如何打破循環中的內循環在python循環?
- 20. 循環內循環?
- 21. 滾動數組與循環
- 22. 創建循環滾動
- 23. 做while循環 - 只有兩次循環 - 應循環8次
- 24. Rails的For循環查看
- 25. 你如何循環查看ID的?
- 26. 如何循環查看本詞典?
- 27. 循環中的SQL查詢循環中
- 28. 循環python中的循環
- 29. 循環滾動網站
- 30. jQuery無限循環滾動
你有沒有解決過這個問題?我會對你的解決方案感興趣。 – dex3703 2013-04-15 20:36:13