그것은 새로운 윈도우의 스레드를 변경할 수 없습니다 바랍니다.
어쩌면 당신은 EventAggregator (here's an example from Caliburn.Micro)와 같은 것을 사용하여 Windows? EventAggregator는 다른 스레드 간의 통신에 대한 세부 사항을 숨기는 데 도움이 될 수 있습니다.
하나의 아이디어는 각 Window가 자체 EventAggregator를 생성하지만 핸들러/가입자의 공유 집합을 갖고 있다는 것입니다.
public class MyEventAggregator
{
private static List<Tuple<CoreDispatcher, object>> subscribers = new List<Tuple<CoreDispatcher, object>>();
public void Subscribe<TMessage>(ISubscriber<TMessage> subscriber)
{
subscribers.Add(new Tuple<CoreDispatcher,object>(Window.Current.Dispatcher, subscriber));
}
그래서 번째 윈도 자체 EventAggregator를 만들고 리스너로 구독 : 각 가입자하면 올바른 CoreDispatcher 저장
public sealed partial class MainPage : Page, MainPage.ISubscriber<Message>
{
public MainPage()
{
this.InitializeComponent();
var eventAggregator = new MyEventAggregator();
eventAggregator.Subscribe(this);
}
을 그리고 (window 2)이 자체 EventAggregator을 만듭니다.
public sealed partial class Secondary : Page
{
public MainPage.MyEventAggregator EventAggregator;
public Secondary()
{
this.InitializeComponent();
this.EventAggregator = new MainPage.MyEventAggregator();
}
명심, 두 번째 윈도와 (window 2)이있는 EventAggregators 가입자의 공유 설정이 있습니다 (window 2)이이 CoreApplication.CreateNewView()를 사용하여 생성된다.
그런 다음 Window2에서 Window1로 메시지를 보내려면 게시를 호출하기 만하면됩니다. 이 코드 (window 2)이에서 버튼 클릭에서입니다 :
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
this.EventAggregator.Publish(new Message("hello from second view"));
}
그리고 EventAggregator는 번째 윈도 자체 UI 스레드에서 메시지를 수신 확인합니다. 번째 윈도 그냥 UI 업데이트 할 수 있도록 :
public void Publish<TMessage>(TMessage message)
{
var messageType = GetEventType(message);
foreach (var subscriber in subscribers)
{
var handler = subscriber.Item2;
if (messageType.IsInstanceOfType(handler))
{
var dispatcher = subscriber.Item1;
dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
((ISubscriber<TMessage>)handler).HandleMessage(message);
});
}
}
}
private static Type GetEventType<T>(T args)
{
return typeof(ISubscriber<>).MakeGenericType(args.GetType());
}
실제로, 하나있는 WeakReferences를 사용해야합니다 또는 다른해야합니다
public void Handle(Message message)
{
this.Message.Text = message.Text;
}
를 여기에 게시-방법의 정말 투 - 포인트 구현이다 기능을 사용하면 GC로 정리할 수 있습니다.
full example of EventAggregator은 Gist를 통해 제공됩니다.
바로 당신이 급하게 질문을 읽는 것입니다. 예, 물론, 각각의 'CoreWindow'는 고유 한 입력 처리 및 메시지 전달을 통해 자체 스레드에서 실행됩니다. 동일한 스레드에서 실행되는 뷰 내부의 'UIElement'계층 구조입니다. 죄송합니다. – IInspectable
나는 분리 된 UI 스레드가 될 이유가 없다. Wpf와 winforms는이 모든 것을 단일 UI 스레드에서 잘 처리합니다. 나는 다른 uwp 프로젝트에서 이것을 잘 알고 있으며, 다른 스레드 사이의 레이어없이이 문제를 해결할 수있는 방법이 있는지 궁금합니다. –