2012-11-05 2 views
4

큰 문제가 있습니다. 내 WPF 응용 프로그램에서 MainWindow에 애니메이션로드 (스토리 보드)가있는 테두리가 있습니다. 기본적으로 축소됩니다. 때로는 많은 양의 데이터를로드하거나 새 XAML 화면을로드 할 때이를 표시하고 접을 수 있습니다.새 스레드를 사용하더라도 WPF 애니메이션이 멈 춥니 다.

우선, 나는 스레딩을 전혀 사용하지 않았으며 애니메이션은 얼어 붙어서 늦게 나타납니다.

그때 나는이 같은 스레딩을 사용하기 시작

Messenger.StartAnimation(); 
var task = Task.Factory.StartNew(() => 
       { 
        Thread.Sleep(150); 
       }).ContinueWith((a) => 
       { 
        // HERE Screen moving + large amount of data loaded with Entity Framework 
        Thread.Sleep(200); 

        Messenger.StopAnimation(); 
       }, CancellationToken.None, TaskContinuationOptions.NotOnFaulted, threadUIContext); 

이번에는 애니메이션은 1 초 동안 근무하고 모든 데이터와 새로운 표시 화면이 곳에로드 때까지 그냥 얼어 붙었다. A 기본 스레드가 모든 스레드를 차단하는 것과 같습니다.

지연을 타이머에 추가하려고했습니다. Messenger.StopAnimation()을 3 초 후에 추가하려고했습니다. 심지어 모든 것이 변경되고 새 화면에로드 된 다음 1 초 동안 애니메이션이 멈추고 애니메이션이 3 초 동안 계속됩니다.

나는 Dispatcher, BackgroundWorker을 시도했으며 이전 코드와 동일한 문제가 발생했습니다.

저는 팝업에 애니메이션을 넣으려고했고 심지어는 새 창에도 투명하게 표시하려고했습니다. 할 것도, 그것은 항상 정보에 대한

... 중지하기 전에 1 초 동안 동결 끝 없다, 나는 (I 목록, 같은 문제를 시도했다) 나는 내 MainWindowContentControl 내부에 다른 화면을로드 ObservableCollection를 사용합니다.

저는 techdays 비디오, Fast and Furious를 보았습니다. 비디오 에서처럼 부드러운 애니메이션을 실제로 만들고 싶었지만 제거가 불가능한 것처럼 보입니다.

+0

확실히 알 수있는 세부 정보는 충분하지 않지만 notifypropertychanged 이벤트를 뷰에 던지면 주 스레드가이를 처리합니다.따라서 스레드를 사용하여 작업을 수행하지만 변경 사항을 계속 알리는 경우 주 스레드는 여전히이를 처리하고 스레드가이를 점유합니다. – Geerten

+0

ObservableCollection에 어떤 컨트롤을 바인딩하고 있습니까? 너는 어떻게 묶고 있니? 바인딩하지 않으면 문제가 해결됩니까? 나는 앱이 데이터를 표시하지 않고는 쓸모가 없다는 것을 안다. 이는 렌더링 문제인지 여부를 파악하는 것입니다. – Paparazzi

답변

1

간단한 컬렉션보기에서 50 개 이상의 작은 이미지를로드 할 때 동일한 문제가있었습니다. .NET Framework가 비트 맵을 화면에 그리는 것은 주 스레드를 묶는 것이고, 나는 그것을 우회 할 수있는 방법이 전혀 없다는 것을 알게되었습니다. 뷰에 모든 요소를 ​​넣으려고했지만 천천히 뷰에 바인딩 된 컬렉션을 채우지 만, 관찰 가능한 컬렉션이 변경 될 때마다 .NET Framework에서 뷰의 모든 이미지를 다시 그리기 때문에이 역시 도움이되지 않았습니다.

저는 Microsoft 엔지니어에게이 문제에 대해 물어 보았으며, 앞으로 Microsoft에서 수정해야 할 .NET Framework의 문제임을 솔직히 인정했습니다. 내 동료는 자신의 알고리즘으로 모든 픽셀을 직접 그려 냄으로써이 문제를 우회 할 수 있다고 말했다.

이 문제를 해결하려면 데이터를 표시하는 방법을 변경해야하지만 해결책을 찾을 수는 없겠지요.

+0

WriteableBitmap을 사용하고 모든 개별 비트 맵을 하나의 큰 비트 맵으로 그려서이를 수정할 수 있습니다. 한 비트 맵이 변경되면 큰 비트 맵의 ​​해당 부분 만 변경하고 해당 특정 영역에 대해 더 레이 잇트를 추가하십시오. MainThread는 더러 웠을 경우에만 다시 그려줍니다. – Geerten

+0

그 질문에 대해 전혀 물어 보지 않았습니다. .NET 컨트롤이 업데이트되는 속도입니다. 또한 컨트롤을 사용하여 (각 이미지 외에도 버튼과 다른 많은 것들이 있음) .NET Framework의 제한 사항을 보았습니다. 그러나 내 질문 컨텍스트가 달라져야한다는 것을 -1로 알려 주셔서 감사합니다. 여전히 내 대답은 풀그가 여기에 갇혀있는 문제를 요약 한 것 같습니다. – Akku

+0

방금 ​​문제에 대해 (내가 도움이 될지도 모른다고 생각했기 때문에) 댓글을 달았습니다. 내 의견은 그 질문에 관한 것이 아니라는 것을 압니다. 그러므로 나는 -1이 아니라, 그것을 한 다른 사람입니다. – Geerten

0

우리는 ObservableCollection에 ListView 바인딩을 사용하여 Jack과 동일한 문제가 있습니다. 많은 분석을 거친 후에 데이터베이스 정렬과 그룹화가 느린 것이지 데이터베이스에 대한 쿼리가 아니라고 결정했습니다. 마침내 별도의 스레드를 구현했지만 디스패처를 호출하여 정렬 및 그룹화를 호출해야만 메인 UI 스레드에 장기 실행 작업을 되돌려 놓았습니다. 그래서 우리의 멋진 "로드 중 ..."애니메이션이 나타납니다. 사용자가 끊어 지거나 움직이는 것처럼 보일 수 있습니다. 우리가 원했던 것이 아닙니다 .... Akku가 말했듯이, 데이터가 표시되는 방식을 변경하는 것 이외에는 해결책을 찾을 수 없습니다.

관련 문제