2014-09-25 2 views
0

C#을 사용하여 WPF appl를 개발 중입니다.진도 막대를 표시하면서 비동기 적으로 stackcontrol에 usercontrols를로드하는 방법

나는 등 비동기 스레딩 및 작업

주위에 내 머리를 얻으려고 노력하고 기본적으로 나는 내 페이지에 StackPanel에 추가하는 것이, UserControl이 있습니다. 스택 패널에이 사용자 컨트롤을 여러 번 반복하여 추가 할 수 있습니다.

i.txtItemDescription.Text = "Item description " + ii.ToString() + ". Put a description here"; 
i.txtItemTitle.Text = "Item title " + ii.ToString() + ". Put a title here"; 
MainStack.Children.Add(i); 

이 작동합니다. 그러나,이 응용 프로그램을 내 Windows 8.1 태블릿으로 전송하면이 usercontrols (UC)의 표시 속도가 크게 느려집니다.

필자는 데이터 액세스 및 UC 생성이 성능에 미치는 영향이 없으므로 아무 효과가없는 가상화를 사용해 보았습니다. 그것은 화면에 컨트롤의 실제 그림입니다.

  1. 배경 스레드 도움말 성능이 실행겠습니까 다음과 같이

    그래서 제 질문은?

  2. 그렇다면 BeginInvoke 또는 작업으로 스택 패널을 어떻게로드합니까? 이 사이트에서 언급 한 거의 모든 답변을 시도했는데 STA 오류가 발생하거나 단순히 내가 원하는 것을하지 않습니다.
  3. 포인트 2에 대한 나의 생각은 스택 패널이로드 될 때까지 대기 진행률 표시 줄 (IsIndefinite = true)을 폼에 표시하고 싶다는 것입니다. 그러나 나는 완전히 엉망이되었다. 모든 경우에 양식 UI는 스택 판넬이 완전히로드 될 때까지 진행률 막대를 업데이트하지 않습니다. 어떤 경우에는 너무 늦었습니다.

의견을 보내 주시면 감사하겠습니다.

Regds

+0

코드 스 니펫은 JS/CSS/HTML 용입니다. 그것은 C#을위한 것이 아닙니다. –

+0

UI 컨트롤은 UI 스레드를 사용하여 '로드'됩니다. 따라서 'ProgressBar'를 사용하는 동안 비동기 적으로로드 할 수 없습니다. Async와 Task는 UI 프로세스가 아닌 비동기 적으로 백그라운드 프로세스를 실행합니다. – Sheridan

+0

스택 패널에 수동으로 컨트롤을 추가하는 특별한 이유가 있습니까? 왜 xaml에서 뷰를 정의하고 (그리고 VirtualizingStackPanel을 사용) 데이터를 바인드 (다른 스레드에서로드 할 수 있습니까) 할 수 있습니까? – Arie

답변

0

먼저, 당신은 그들이 궁극적에 렌더링되는 것과 다른 스레드에서 UI 요소를 만들고, 그래서 그 가능성에 대해 잊을 수 없다.

성능 문제의 원인이되는 컨트롤의 실제 그림 인 경우 UI 가상화를 올바르게 사용하지 않는 것일 수 있습니다. UI 가상화의 전체적인 요점은 실제로 볼 수있는 컨트롤에 대해서만 레이아웃과 렌더링을 수행한다는 것입니다. 이는 어떤 종류의 항목 호스트 (예 : ItemsControl)가 필요에 따라 해당 UI 요소를 생성하도록하는 것을 의미합니다. 전체 패널을 미리 채우면 용도가 무효가되고 StackPanel은 가상화를 지원하지 않습니다. 나는 다음과 같은 제안 :

  1. 대신 직접 StackPanel를 사용하는 자사의 ItemsPanelTemplateVirtualizingStackPanelItemsControl를 사용합니다.

  2. 사용자 컨트롤을 수동으로 추가하는 대신 ItemsSource을 기본 항목 목록에 바인딩하고 ItemsControl 항목을 볼 때 가져올 컨테이너를 생성하게하십시오.

  3. ItemTemplate을 사용하여 항목의 렌더링 방식을 정의합니다. 예를 들어, 템플릿 콘텐츠는 적절한 바인딩을 사용하여 사용자 컨트롤이어야합니다.

VirtualizingStackPanel에서 컨테이너 재활용을 실험 해 볼 수 있습니다. 유스 케이스에 따라 성능이 저하되거나 손상 될 수 있습니다.

어쨌든이 조언을 따르는 경우 항목의 UI 요소가 필요에 따라 (예 :보기로 스크롤 될 때) 생성되므로 진행률 표시기가 필요하지 않습니다.

(기본 스타일을 지원하지 않습니다), 당신은 출발점으로 아래의 스타일을 사용하기 전에 당신이 평범한 구식 ItemsControl와 가상화를 사용한 적이있는 경우

. 기본 ItemsControl 스타일과 달리 스크롤링을 지원합니다.

<Style TargetType="{x:Type ItemsControl}"> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" 
      Value="Auto" /> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" 
      Value="Auto" /> 
    <Setter Property="ScrollViewer.CanContentScroll" 
      Value="True" /> 
    <Setter Property="ScrollViewer.PanningMode" 
      Value="Both" /> 
    <Setter Property="Stylus.IsFlicksEnabled" 
      Value="False" /> 
    <Setter Property="VerticalContentAlignment" 
      Value="Center" /> 
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" 
      Value="True" /> 
    <Setter Property="VirtualizingStackPanel.VirtualizationMode" 
      Value="Recycling" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ItemsControl}"> 
     <Border x:Name="OuterBorder" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="True"> 
      <ScrollViewer Padding="{TemplateBinding Padding}" 
         Focusable="False"> 
      <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
      </ScrollViewer> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" 
        Value="False"> 
      <Setter TargetName="OuterBorder" 
        Property="Background" 
        Value="{DynamicResource {x:Static apthemes:AssetResourceKeys.ListBackgroundDisabledBrushKey}}" /> 
      </Trigger> 
      <Trigger Property="IsGrouping" 
        Value="True"> 
      <Setter Property="ScrollViewer.CanContentScroll" 
        Value="False" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="VirtualizingStackPanel.IsVirtualizing" 
      Value="True"> 
     <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
    </Style.Triggers> 
</Style> 
+0

감사합니다. 마이크! 이것은 대접을했다! !!! –

관련 문제