다른 스레드를 생성하여 UI 스레드에 넣으면 Visual Tree에 추가 할 수 없다는 것을 알고 있습니다. 다른 스레드가 해당 스레드를 소유하고 있기 때문에 해당 개체에 액세스 할 수 없다는 예외가 발생합니다.WPF에서 무거운 사용자 컨트롤 만들기
내 현재 시나리오는 200 (FrameworkContentElement) 컨트롤을 DockWindow에 추가하는 것과 같이 많이 사용하고 있습니다. 이 UI를 동결하지 않고 UI 스레드에로드하려고 할 수 있습니까? 다른 스레드에서 작업하는 동안 대화 상자를 표시하는 동안 UI 스레드를 사용하기 때문에 진행 대화 상자를 표시 할 수 없습니다. 처리해야하는 것이 데이터이고 UI에 배치해야하지만 이번에는 이들을 작성해야합니다. UI 컨트롤.
UI 컨트롤을 만들고이를 MemoryStream에 직렬화하여 UI 스레드에로드하는 방법을 생각해보십시오. 한 가지 문제는 컨트롤에 DataContext를 다시 첨부해야한다는 것입니다. 그 순간에 다른 스레드에 위임 할 수 있습니다. 문제는 여전히 이것입니다 실현 가능 할 수 있습니까?
ApartmentState를 STA로 만들기 위해 Task와 Thread 객체를 섞어 보았지만 여전히 운이 없었습니다.
public static Task<T> StartSTATask<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
Thread thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception e)
{
tcs.SetException(e);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task;
}
편집 :이 컨트롤이 다시 도움이되지 않습니다이 시나리오에서 컨트롤을 가상화, FrameworkContentElement 있습니다. 이것은 런타임에 컨트롤을 만드는 FlowDocument 컨트롤과 함께 사용됩니다. 말해, 실행, 테이블, 단락 등. 따라서 ListBox, TreeViews 등은이 시나리오에 적용 할 수 없습니다.
[가상화 컨트롤] (http://msdn.microsoft.com/en-us/library/cc716879.aspx)을 확인 했습니까? – Shoe
예 이러한 컨트롤은 불행히도 FrameworkContentElement이고 FrameworkElements가 아니라는 것을 알고 있습니다. RichTextBox/FlowDocumentScrollViewer 컨트롤로로드하고 있습니다. –