2015-01-01 3 views
2

모든 항목을로드하고 WPF ListView에 표시 한 후 어떤 이벤트가 발생합니까? ListView에서 많은 항목을 표시하도록 최적화하려고합니다. ListView에는 다음 코드가있는 Items가 채워집니다.모든 항목을로드하고 ListView에 표시 한 후 어떤 이벤트가 발생합니까?

List<Artist> selectedArtistsList; 
//Code to fill selectedArtistsList with about 6,000 items not shown here 
CollectionViewSource selection1ViewSource = ((CollectionViewSource)(this.FindResource("selection1Source"))); 
Stopwatch stopWatch1 = new Stopwatch(); 
stopWatch1.Start(); 
selection1ViewSource.Source = selectedArtistsList; 
stopWatch1.Stop(); 
Debug.Print("Time used: {0}ms", stopWatch1.ElapsedMilliseconds.ToString()); 

이 코드를 실행하면 "119ms가 사용 된 시간"또는 유사한 내용이 표시됩니다. 그러나 ListView에있는 Item을 화면에서보기 전에 약 3 초 정도 더 걸립니다. ListView를 항목과 함께로드 한 후에 발생하는 이벤트가 있습니까? ListView가 사용자에게 준비되었을 때 측정하는 데 관심이 있습니다.

+0

'listView.ItemContainerGenerator.ItemsChanged'을 사용해보세요. WPF는 별도의 스레드에서 렌더링되므로 렌더링이 완료된 후 코드를 실행하려면 Dispatcher.Invoke를 우선 순위 <렌더링 –

+0

으로 시도해 볼 수 있습니다. 3 초가 지나면 가상화되지 않을 수 있습니다. XAML을 게시하십시오. – Paparazzi

+0

감사합니다. @Blam, 가상 화에 대해 확인하겠습니다. 이제는 내 목록을 표시하는 데 걸리는 시간을 정확히 확인하는 방법을 알고 나면 코드 개선을 위해 여러 가지 방법을 비교하는 것이 더 쉬울 것입니다. – Edgar

답변

1

의견을 보내 주셔서 감사합니다. 해결책을 찾았습니다. Nick Baker의 의견을 듣고 Dispatcher.Invoke를 찾아 봤습니다. 읽기 테스트 후 나는이 페이지

을 발견

WPF :

: 윈도우 렌더링은 다음 http://geekswithblogs.net/ilich/archive/2012/10/16/running-code-when-windows-rendering-is-completed.aspx

을 완료 나는 다음 (안 전체 코드, 단지 관련 부분)에 내 코드를 변경할 때 코드를 실행

private void Work(){ 
    List<Artist> selectedArtistsList; 
    //Code to fill selectedArtistsList with about 6,000 items not shown here 
    CollectionViewSource selection1ViewSource = ((CollectionViewSource)(this.FindResource("selection1Source"))); 
    stopWatch1.Reset(); 
    stopWatch1.Start(); 
    selection1ViewSource.Source = selectedArtistsList; 
    Debug.Print("After setting Source: {0}ms", stopWatch1.ElapsedMilliseconds.ToString()); 

    //New: 
    Dispatcher.BeginInvoke(new Action(RenderingDone), System.Windows.Threading.DispatcherPriority.ContextIdle, null); 
} 

//New 
Stopwatch stopWatch1 = new Stopwatch(); 
private void RenderingDone() { 
    Debug.Print("After rendering is done: {0}ms", stopWatch1.ElapsedMilliseconds.ToString()); 
} 

이를 실행 한 후 나는 참조 : 를 소스를 설정 한 후 : 124ms 을 렌더링이 완료되면 : 2273ms

마지막 줄 AP 통신을 렌더링이 완료된 후 배가 나타나고 정확한 시간이 표시됩니다. 이것은 내가 원하는 것입니다.

관련 문제