2011-03-13 3 views
2

동적으로 빌드하는 WP7 앱의 페이지가 있습니다. 그리드에 60 개의 사용자 컨트롤을 만들고 추가하는데 약 5 초가 걸립니다. 이 속도를 높이는 방법을 찾아야합니다. 다음과 같이wp7에서 동적으로 사용자 컨트롤을 추가하는 속도를 올리는 방법

과정은 다음과 같습니다

  1. 가 grid.Children 컬렉션에 컨트롤을 추가 컨트롤 행 속성
  2. 의 값을 설정
  3. 사용자 컨트롤
  4. 추가 새로운 그리드 행 정의를 작성 .

시간이 걸리는 것은 4 단계입니다. 나는 이것을 할 때마다 시각적 트리가 재구성되고 있다고 생각합니다.

자식 컬렉션 업데이트를 완료 한 후에 만 ​​시각적 트리를 다시 빌드하도록 그리드에 지시하는 방법이 있습니까?

아니면 더 좋은 방법이 있습니까?

업데이트 : WP7 Toolkit의 List Picker 컨트롤로 인해 문제가 발생했습니다. 내가 1로 바꿨을 때 나는 25 초에서 1 초로 감소 된 전화의 페이지를 표시하는 데 걸린 시간을 나 자신에게 썼다.

+0

StackPanel을 사용하는 것이 좋습니다. 컨트롤은 GridRow 방식이 아닌 자동으로 정렬됩니다. –

+0

격자를 스택 패널로 교체하려고 시도했지만 성능이 전혀 향상되지 않았습니다. 부모에게 컨트롤을 추가 할 때마다 부모가 스택 패널인지 그리드인지에 관계없이 시각적 트리가 다시 계산됩니다.한 번에 모든 컨트롤을 추가하는 방법이나 지시 할 때까지 페이지를 다시 작성하지 말라고하는 방법이 필요합니다. 컨트롤을 채우고 Children 컬렉션에 모든 것을 전달할 수 있도록 UIElementCollection을 만들려고했지만 생성자가 내부 생성자이므로 하나를 만들 때 오류가 발생합니다. –

+1

UserControl 개체가 포함 된 ObservableCollection에 바인딩 된 StackPanel을 사용해 볼 수 있습니다. 처음에 ObservableCollection 속성을 null로 설정 한 다음 모든 ObservableCollection에 모든 UserControls를 추가합니다. 일단 작업이 끝나면 두 번째 ObservableCollection을 바운드 속성에 할당 한 다음 NotifyPropertyChanged 이벤트를 발생시켜 업데이트 할 페이지를 알립니다. 초기 생성 후에도 콜렉션이 변경되지 않으면 ObservableCollection을 List로 바꿀 수 있습니다. – Praetorian

답변

1

/귀하의 목표는 비주얼 트리를 업데이트하는 횟수를 줄이고 시도하는 것입니다.

몇 가지 제안 : (의 일부)를 포함

  • 시도 기본적으로 페이지의 항목 그러나 다만 가시성은 당신이 필요에 따라 변경합니다.
  • 코드에서 전체 표를 작성하고 한 번에 한 줄씩 추가하지 않고 한 번에 페이지에 추가하십시오.
  • 내용에 따라 ListBox를 사용하여 각 행에 사용 된 템플릿을 다른 내용을 표시하십시오.

당신에게 가장 잘 맞는 기술은 실제로 UI에 추가하는 것에 달려 있습니다. 자신에게 가장 적합한 것을보기 위해 테스트해야합니다.

+0

제안에 감사드립니다. 생각 번호 2는 트릭을 만들었으므로 그리드를 만들었고 모든 컨트롤을 추가 한 다음 그리드를 페이지의 부모 그리드에 추가했습니다. 변경 없음. 나는 전화로 그것을 테스트하고 페이지를 표시하는 데 25 초를 보냈습니다! –

+0

ListBox를 지금 사용해보십시오. 큰 변화를 만들었습니다. 25 초에서 10 초. 나는 ListBox에 내장 된 가상화 스택 패널이 여기에서 도움이되고 있다고 생각한다. –

1

UI 가상화 (예 : ListBox)가 도움이되면 문제가 귀하의 컨트롤에 있어야합니다. 템플릿, 바인딩, 변환기, C# 코드 대신 Xaml 사용, 요소 이름과 같은 불필요한 Xaml 구문, 복잡해진 시각적 트리 (예 : 불필요한 격자) 등 - 성능을 저하시킬 수있는 요소입니다.

증가하는 시각적 트리 재구성 (나는 그렇게 생각하지 않습니다)이 의심되는 경우 MeasureOverride/ArrangeOverride 메소드를 간단히 디버그하십시오.

나는 this article이 더 많은 조언을 줄 것 같습니다. 거기에 126 개의 하위 컨트롤이있는 MonthCalendar와 비슷한 복잡한 컨트롤을 최적화 한 방법에 대해 설명했습니다. 제어 로딩 시간이 대략적으로 감소했습니다. 5 배!

+0

제안 해 주셔서 감사합니다. 나는 당신이 정확하다고 생각합니다. - 목록 상자는 문제를 숨기고 고치지 않습니다. 내 사용자 컨트롤은 매우 간단합니다. 대부분은 텍스트 블록과 그리드에 정렬 된 텍스트 상자입니다. 가장 많이 사용되는 사용자 정의 컨트롤에는 툴킷의 목록 선택기 컨트롤이 포함되어 있습니다. 이 문제를 일으키는 지 보려면 잠시 텍스트 상자로 바꾸고 시도해 보겠습니다. 사용자 컨트롤 외에 모든 것은 코드에 의해 생성됩니다. 바인딩, 템플릿 또는 변환기가 없습니다. –

+0

TreeHelper.Dump()를 사용하여 시각적 트리를 분석하여 시작할 것입니다. 더 자주 당신은 불필요한 구조를 많이 발견 할 것입니다. 그리고 시간 측정을 잊지 마십시오. 객관적인 측정이 필요합니다. –

+0

문제를 일으키는 List Picker 컨트롤 인 것처럼 보입니다. 나는 자기 자신을 썼고 그리드로 돌아간 후에도 1 초가 걸린다. –

관련 문제