2009-07-03 96 views
10

WPFでは、ListView.ScrollIntoViewを使用して特定のアイテムを表示することができますが、アイテムが表示されるようにスクロールする量は最小限に抑えられます。ListViewをListViewの先頭にスクロールする

表示するアイテムがListViewの上部にスクロールされるようにスクロールするにはどうすればよいですか?

ScrollIntoViewを2回呼び出すことを考えました。一度上に表示したいアイテムと最後に表示されたアイテムについてもう一度やり直してみましたが、最後に表示されたアイテムを見つける方法はわかりません。

答えて

14

ListViewのControlTemplateにあるScrollViewerを取得すると、これを行うことができます。 ScrollViewerにアクセスすると、スクロール方法が異なるa lotが公開されます。我々はまた、我々はからScrollViewerのを取得するために使用できるものが必要になります

<ListView ItemsSource="{Binding Percents}" 
     SelectionChanged="OnSelectionChanged" 
     x:Name="uiListView"/> 


public List<int> Percents { get; set; } 

public Window1() 
{ 
    InitializeComponent(); 

    Percents = new List<int>(); 
    for (int i = 1; i <= 100; i++) 
    { 
     Percents.Add(i); 
    } 
    this.DataContext = this; 
} 

まず、我々はこの効果を追加したいリストビューを作成することができますリストビュー。私はカスタムスクロールで作業する前にこれと似たようなものを使用しました。ここでも同様に使用できます。

public static DependencyObject GetScrollViewer(DependencyObject o) 
{ 
    if (o is ScrollViewer) 
    { return o; } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) 
    { 
     var child = VisualTreeHelper.GetChild(o, i); 

     var result = GetScrollViewer(child); 
     if (result == null) 
     { 
      continue; 
     } 
     else 
     { 
      return result; 
     } 
    } 

    return null; 
} 

これで、SelectionChangedイベントを処理するだけで済みます。アイテムをリストの一番上にスクロールしようとしているので、最下部までスクロールしてから、選択したアイテムまでスクロールすることをお勧めします。あなたが言ったように、ScrollIntoViewはアイテムが見えるようになるまでスクロールするので、選択したアイテムがスクロールバックして一番上に来ると、選択したアイテムがリストの一番上に表示されなくなります。

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer; 
    scrollViewer.ScrollToBottom(); 

    uiListView.ScrollIntoView(e.AddedItems[0]); 
} 
+0

パーフェクト:)ありがとう – Ray

+0

それは私の魅力のように動作します。ありがとう!!! – thowa

+1

注:WPF拡張ツールキットを使用している場合は、1行のコードでScrollViewerを取得できます。VisualTreeHelperEx.FindDescendantByType (YourListView); –

0

これはは下までスクロール避けること@rmooreの答えに代わるものです。これは、SelectionMode=Singleの場合にのみ有効であることにも注意してください。

ScrollViewer.CanContentScroll=Trueの場合、ScrollViewerSelectedIndexに直接スクロールできます。

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;  
    scrollViewer.ScrollToVerticalOffset(listView.SelectedIndex); 
} 

とケースScrollViewer.CanContentScroll=Falseにはいくつかの追加XAMLが必要となります。

<ListView ScrollViewer.CanContentScroll="False" ItemsSource="{Binding Percents}" x:Name="uiListView"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <EventSetter Event="Selected" Handler="OnSelected"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

そしてScrollViewerListViewItemの上部の垂直オフセットに移動することができます。

private void OnSelected(object sender, RoutedEventArgs e) 
{ 
    ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;  

    ListViewItem listViewItem = (ListViewItem)e.Source; 
    Point offset = listViewItem.TranslatePoint(new Point(), scrollViewer); 
    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset.Y); 
} 
関連する問題