2009-04-29 4 views
2

Hy.WPF/C# scrollviewer에서 텍스트 래핑을하면 창 크기가 느려집니다.

ListBox에 scrollviewer가 있습니다. 목록 상자의 각 항목 (40 ++ 항목)에는 텍스트 블록과 작은 이미지가 있습니다. 창 크기를 조정할 때 크기가 매우 어둡습니다. 항목의 textblock 표시 여부를 "축소"로 설정하면 크기 조정이 괜찮습니다. 첫 번째 방법은 scrollviewer에 표시되지 않은 각 항목의 가시성을 "축소"로 설정하는 것이었지만 항목이 사용자에게 표시 될 때 표시기를 찾을 수 없었습니다.

크기 조정 과정을 덜 지연 시키거나, 텍스트 블록 대신 다른 컨트롤을 사용하려는 생각이 있습니까? 도움 주셔서 감사합니다.

+0

XAML 또는 단순화 된 repro pls를 게시하십시오. –

답변

0

가장 좋은 방법은 크기 조정의 성능이 향상 :

public bool IsItemVisible(ListBox listBox, int index) 
{ 
    if (listBox.Items.Count != 0) 
    { 
     VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0)); 
     int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight; 
     return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount; 
    } 

    return false; 
} 

당신은 다음과 같이 사용할 수 있습니다 ScrollContentPresenter 내에 VirtualizingStackPanel을 사용하십시오. ListBox와 같은 데이터 템플릿이나 일반적으로 ItemsPanel에서이를 재정의 할 수 있습니다.

사용자가 볼 수 있는지 여부에 관계없이 모든 항목을 항상 렌더링하는 일반 StackPanel과 비교하여 보이지 않는 항목을 렌더링하지 않습니다.

나를 위해 아주 잘 작동합니다.

0

다음의 지정 여부에있는 항목 오프셋되어 주어진 표시 여부 :

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = listbox1.Items.Count - 1; i >= 0; i--) 
     if (!IsItemVisible(listbox1, i)) 
      ((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed; 
} 
+0

모든 스크롤링 활동과 모든 단일 크기 변경 이벤트 (마우스 이동 이벤트 당 꽤 자주)에서이 검사가 필요하기 때문에 그 점이 저에게 효과가 있는지 모르겠습니다. 적어도 모든 항목을 표시하고 접을 수는 없으므로 성능이 저하 될 것이라고 생각합니다. – dalind

+0

몇 가지 기준으로 목록 상자의 내용을 필터링하지 않는 이유는 무엇입니까? (예 : 각 항목의 첫 글자로) – CSharper

+0

필자는이를 필사적으로 다루지 만 내 관점에서는 이것이 가시성과는 아무런 관련이 없습니다. 항목의 가시성은 스크롤 뷰어의 트랙을 이동할 때마다 바뀔 수 있으므로 필터링은 의미가 없습니다. 아니면 내가 뭔가를 이해하지 못 했니? – dalind

관련 문제