2010-04-26 4 views
2

저는 많은 양의 데이터를 상당히 새로운 방식으로 표시하는 데 사용되는 큰 (~ 50000px 너비) "캔버스"유형 영역이있는 인터페이스를 작성하고 있습니다. 여기에는 선, 직사각형 및 텍스트가 많이 포함됩니다. 사용자는 스크롤하여 전체 캔버스를 탐색 할 수 있습니다.WPF에서 많은 수의 시각적 요소를 그리기위한 제안 된 (간단한) 방법?

지금 나는 다양한 모양의 캔버스 패널을 사용하고 있습니다. 멋지기도하고 쉽게 할 수 있습니다 : 도형을 만들고, 좌표를 지정하고, 캔버스에 붙입니다. 불행히도, 꽤 느립니다 (실제 렌더링을하지 않고 어린이를 구성하는 것).

somealternatives으로 보았습니다. 약간 위협적입니다. 저는 공상적인 것을 필요로하지 않습니다. 좌표면에서 효율적으로 오브젝트를 구성하고 배치하는 능력. 내가 얻은 모든 것이 선, 색칠 된 사각형 및 텍스트라면, 나는 행복 할 것이다.

내부에 Geometry Group의 내부에 GeometryDrawing의 내부에 Panel 컨테이너가 있어야합니까?

참고 : 가능하면 동일한 공간에 텍스트와 그래픽 (즉, 색상이 지정된 직사각형)을 포함하고 싶습니다.

답변

2

모양이 상당히 무겁습니다. 그래픽 경로를 사용해보아야합니다. 사용자가 그림의 개별 부분과 상호 작용할 필요가 없으며 때로는 그럴 때도 훨씬 효율적입니다.

-1

셰이프 인스턴스가 많은 경우 작업자 스레드에서 비동기 적으로 구성하고 Dispatcher를 통해 실제 추가 작업을 큐에 넣을 수 있습니다. 여기서 아이디어는 UI가 즉시 완료되지 않을 것이지만 사용자는 요소가 즉시로드되는 동안 즉시 상호 작용을 시작할 수 있다는 것입니다.


편집 : 위의 내용은 잘못되었습니다. WPF에서는 시각적 요소가 UI 스레드에서 만들어 지도록 요구합니다. 당신은 여전히이 같은 패턴을 사용하여 '게으른'시각적로드 이런 종류의 작업을 수행 할 수 있습니다

private Random _random = new Random(); 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     Thread testThread = new Thread(TestThread); 
     testThread.Start(); 
    } 

    private void TestThread() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      Dispatcher.BeginInvoke((Action)CreateShape); 
     } 
    } 

    private void CreateShape() 
    { 
     var shape = new Rectangle(); 
     shape.Width = _random.Next(10, 50); 
     shape.Height = _random.Next(10, 50); 
     shape.Fill = new SolidColorBrush(Colors.Red); 
     Canvas.SetLeft(shape, _random.Next(0, 400)); 
     Canvas.SetTop(shape, _random.Next(0, 200)); 
     LayoutRoot.Children.Add(shape);    
    } 

을이 기본적으로 UI 스레드에서 '비동기 적으로'실행하는 작업을 큐 (예 : 메시지 펌프가 서비스되고마다) 따라서 '긴'UI 업데이트를 수행하는 동안 응답 성을 유지할 수 있습니다.

+1

-1 : 기본 창 UI 지식 : UI 요소는 UI에서 만들어야합니다. 스레드 - 여기는 작업자 스레드가 아닙니다.) – TomTom

+0

; 나는 이것을 테스트하고 비주얼을 생성하는 것은 스레드 컨텍스트에 의존한다. Visual Tree에 실제로 추가 할 때까지 UI 인프라에 연결하지 않을 수도 있습니다. –

+0

그건 활성 x 시간으로 되돌아 가서 기본적으로 호환성을 유지하는 오래된 문제입니다. 하위 요소가 활성 x 컨트롤 일 수있는 windows 양식 요소를 시작하는지 여부는 알 수 없습니다. – TomTom

1

필요없는 도형을 만들지 말고 이미 가지고있는 도형을 재활용하십시오. 기본적으로 사용자는 전체 화면을 보지 않으므로 보이지 않는 모양은 사용하지 마십시오. 피할 수있는 새로운 것을 만들지 마십시오. 기본적으로 도형을 "준비"목록에 떨어 뜨려서 재사용 할 수 있습니다.

관련 문제