2011-08-31 3 views
1

WP7 용 TV 목록 앱을 개발하고 있지만 피벗 컨트롤에 문제가 있습니다. 사용 가능한 모든 EPG 채널을 처음에 추가했지만 성능이 매우 떨어졌습니다 (심지어 실제 전화기), 데이터 또는 제어없이 PivotItems를 추가하기 위해 ~ 10-15 초가 소요되어 25 이 비어 있습니다.많은 PivotItem이있는 피벗

그래서 처음에는 세 개의 항목 만로드 한 다음 사용자가 왼쪽 또는 오른쪽으로 쓸어 버릴 때마다 한 번 더 추가하는 동적/지연로드 지향 접근 방식을 테스트했습니다. 문제는, 새 항목을 스 와이프하면 databound 컬렉션의 현재 슬롯을 오른쪽으로 한 슬롯 앞으로 밀어 넣고 화면에 지저분한 렌더링을 만듭니다. 즉, 은 놀랍지 않습니다. 왜냐하면 SelectedIndex는 변경되지 않지만 선택한 항목은입니다. 그러나 SelectedIndex를 수정하면 상황이 더욱 악화되어 Pivot이 일관성없는 레이아웃에 갇히게됩니다.

여기서 코드이다 :

public void ChangeChannel(){ 

     if (index < 0) return; 
     int i = index; 
     int tot = Epg.Channels.Count; 
     int slack = (i == 0) ? -1 : i > oldIndex ? 1 : -1; 

     var ch = this.Channels[i]; 
     var nextIndex = (ch.ChannelIndex + slack) % tot; 
     if (nextIndex < 0) nextIndex += tot; 

     var next = Epg.Channels[nextIndex]; 
     if (!this.Channels.Contains(next)) 
     { 
      if (slack < 0) 
      { 
       this.Channels.Insert(0, next); 
       //Index++; 
      } 
      else 
       this.Channels.Add(next); 
     } 

     oldIndex = i; 
    } 

방법은 Caliburn.Micro 의해 Pivot.LoadingPivotItem에 관련된다. 인덱스이는 기본 모델 객체와 this.Channels입니다 Pivot.SelectedIndex에 Epg.Channels를 바인딩하는 것은 Pivot.ItemsSource

편집에 바인딩 된 ObservableCollection에 있습니다 : 트릭 발견. 정말 빨리 작동하는 10-12 개 이하의 탭이있는 피벗 (Pivot)이있는 RSS 리더 앱이 있다는 것을 상기했을 때 의심 스러웠습니다. 즉, Caliburn을 사용하지 않고 비슷하게 작동하는 작은 테스트 응용 프로그램을 만들었습니다. 오, 그거 성능이야! 그러나 칼리 번은 너무 무겁습니까? 정말, 내가 기본 AppBootstrapper 코드의 작은 조각 발견 이후 : Caliburn을 종료 할 필요없이, 그것은 성능을 향상 제거

  ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding = 
      (viewModelType, path, property, element, convention) => 
      { 
       if (ConventionManager 
        .GetElementConvention(typeof(ItemsControl)) 
        .ApplyBinding(viewModelType, path, property, element, convention)) 
       { 
        ConventionManager 
         .ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path); 
        ConventionManager 
         .ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, viewModelType); 
        return true; 
       } 

       return false; 
      }; 

합니다. 그래, 나도 알아, 그게 더 조사할만한 것이지만, 지금은 모든 것들을 고쳤다.

+2

이 작업을 수행하지 마십시오. 사용자가 Pivot을 사용하여 25 개의 항목을 쓸어 넘기를 정말로 기대합니까? 피벗 (Pivot)에 약 7-8 개 이상의 항목이 없어야한다고 말한 지침을 읽은 것을 기억합니다. 이는 매우 좋은 규칙입니다. 채널을 분류하고 ListBox가 포함 된 기본 페이지를 만들거나 각 범주가 PivotItem을 차지하는 피벗 일 수도 있습니다. 사용자가 카테고리를보기 위해 선택하면 해당 카테고리의 모든 채널을 표시하는 다른 Pivot으로 이동합니다. – Praetorian

+0

@Praetorian 물론, 앱에는 빠른 채널 선택 페이지가 있습니다. – unsafecode

답변

3

피벗의 5 개 항목 위에있는 항목이 노티팩의 성능에 영향을 줄 수 있습니다.
사용자가 많은 수의 항목 사이를 탐색하려고하면 매우 어려울 수도 있습니다.

숫자가 큰 항목을 표시하려면 실제로 피벗을 사용해야하는 경우 항목을 3 개만 사용하여 인스턴스를 만들고 선택한 항목이 바뀌면서 각 항목의 바인딩을 업데이트하면됩니다. 목표는 현재 표시된 항목의 양쪽에 항목을 채우는 것입니다. 논리는 약간 지저분해질 수 있습니다 (현재 선택된 항목과 이전에 표시된 항목에 따라 다른 바인딩을 업데이트 함).

+0

시도했지만 성능이 최악입니다. 전략 (항목 교체 대 바인딩 업데이트)을 변경하는 경우에도 지금까지 본 적이 있습니다. 나도 몰라, 어쩌면 나는 오른쪽 슬쩍 단지 게으른 로딩, 꽤 잘하고 원활하게 작동하지만, 여전히 부끄러움을 지킬거야 ... – unsafecode

+0

@MattLacey 내 ViewModel에 피벗 바인딩 해요 (3 항목을 선택하면 피벗에서 3 개의 PivotItem이 생성됩니다. 문제는 ViewModel을 업데이트하면 현재 피벗 항목과 피벗 항목이 오른쪽으로 업데이트된다는 것입니다. 그러나 왼쪽의 피벗 항목 (화면에 표시되지 않음)은 업데이트되지 않습니다. 왼쪽으로 끌 때이 문제가 발생할 수 있습니다. 이 문제를 해결하는 방법? – onmyway133

0

대신 custom handling of flicking left/right을 사용하고 나면 콘텐츠를 업데이트하십시오. 애니메이션을 사용하면 전환을 시뮬레이션 할 수 있습니다.

나는 만화 리더를 이렇게 만들었습니다. 매우 쉽고 성능에 영향을주지 않습니다.

+0

피벗과 같은 애니메이션을 어떻게 시뮬레이트 할 수 있습니까? – onmyway133