2016-07-27 9 views
0

ListBox ItemsSourceの以前の状態(つまり、現在の水平スクロールオフセットと垂直スクロールオフセット、および選択範囲)を維持しながら、後でListBoxを再作成して再作成したいとします。私は、リストボックスを再作成する際に、スクロールプロパティと選択がクリアされ、このコードでListBox ItemsSourceのバックアップと復元の状態

ObservableCollection<string> items = new ObservableCollection<string>(); 

public MainWindow() { 
    InitializeComponent(); 

    for (int i = 1; i < 25; i++) items.Add(""); 

    listBox.ItemsSource = items; 
} 

private void btnDepopulate_Click(object sender, RoutedEventArgs e) { 
    //how to backup the state? 
    listBox.ItemsSource = null; 
} 

private void btnRepopulate_Click(object sender, RoutedEventArgs e) { 
    listBox.ItemsSource = items; 
    //how to restore the state? 
} 

はここしばらく私のコードです。

答えて

2

リストボックスをリストビューに変更することを強くお勧めします。 Why?

ListViewはListBoxから継承されているため、ListBoxのすべての機能をListViewでも使用できます。

のWindows 8.1の場合

上記なぜ私が推薦しますか? ListViewにはListViewPersistenceHelperがあるので、ListViewの相対スクロール位置を保存および取得するのに役立ちます。

はListViewPersistenceHelper

を実装し、あなたの選択のために、あなたがApp.xamlでグローバル変数を作成する方法のため、このExampleを参照してください。

public int ListViewScrollSelectedIndex; 

ListViewのSelectedIndexを保存します。 ListViewを再作成するときは、

ListView.SelectedIndex = ListViewScrollSelectedIndex; 

のように設定できます。これは両方の問題を処理する必要があります。 WPFについては

あなたは、リストボックスの現在のスクロール位置を取得したい場合は、まずそのスクロールビューアへのアクセスを獲得する必要があります。

スクロールビューアを取得するコードは次のとおりです。

private ScrollViewer GetObjectScrollViewer(DependencyObject dependencyObject) 
    { 
     if (dependencyObject is ScrollViewer) 
      return dependencyObject as ScrollViewer; 

     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++) 
     { 
      var _scrollViewer = GetObjectScrollViewer(VisualTreeHelper.GetChild(dependencyObject, i)); 
      if (_scrollViewer != null) return _scrollViewer; 
     } 
     return null; 
    } 

ScrollViewerのはあなたのScrollViewerのの垂直位置を与えるVerticalOffsetを持っています。 ListBoxをディポピュレートしているときに、App.xamlで作成された変数にその変数を二重に保存します。

var _ListBoxScrollViewer = GetObjectScrollViewer(MyListBox); 
ScrollPosition = _ListBoxScrollViewer.VerticalOffset; 

あなたは再びそれを移入するとき、それは戻って同じ位置に行くことができるように、今、ScrollViewerののScrollToVerticalOffsetを割り当てます。

var _ListBoxScrollViewer = GetObjectScrollViewer(ListBox); 
if (_ListBoxScrollViewer != null) _ListBoxScrollViewer.ScrollToVerticalOffset(ScrollPosition); 

希望がこれに役立ちます。

+0

私はWPFを使用しており、あなたのリンクはWindows Apps(Windows 8および10)のようです。私は正しい? – Drarig29

+1

ああ、私は参照してください。私はリストボックス自体のために私の答えを編集しています。 – AVK

+0

@ Drarig29これは役に立ちましたか?あるいは、質問に関係する情報が必要ですか? – AVK

関連する問題