2012-07-05 34 views

回答

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(); 
    } 
} 
+0

你有沒有解決過這個問題?我會對你的解決方案感興趣。 – dex3703 2013-04-15 20:36:13