いくつかの達人がここにあります願っています。
多分、あなたはEventAggregator(here's an example from Caliburn.Micro)のようなものを使って、Windows間で通信することができますか? EventAggregatorは、異なるスレッド間の通信の詳細を隠すのに役立ちます。
1つのアイデアは、それぞれのWindowが独自のEventAggregatorを作成しますが、ハンドラ/サブスクライバの共有セットを持っていることです。あなたは正しいCoreDispatcherを格納し、各加入者の場合:
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));
}
だから、ウィンドウ1には、独自のEventAggregatorを作成し、リスナーとしてサブスクライブ:
public sealed partial class MainPage : Page, MainPage.ISubscriber<Message>
{
public MainPage()
{
this.InitializeComponent();
var eventAggregator = new MyEventAggregator();
eventAggregator.Subscribe(this);
}
そして、ウィンドウ2は、独自のEventAggregatorを作成します。
public sealed partial class Secondary : Page
{
public MainPage.MyEventAggregator EventAggregator;
public Secondary()
{
this.InitializeComponent();
this.EventAggregator = new MainPage.MyEventAggregator();
}
覚えておいて、両方のウィンドウ1とウィンドウ2でEventAggregatorsは、加入者の共有セットを持っています:ウィンドウ2はCoreApplication.CreateNewView()を使用して作成されます。
次に、Window2からWindow1にメッセージを送信する場合は、単にPublishを呼び出します。
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
this.EventAggregator.Publish(new Message("hello from second view"));
}
そしてEventAggregatorは、ウィンドウ1は、独自のUIスレッドにメッセージを受信したことを確認する:このコードは、ウィンドウ2でボタンクリックからです。ウィンドウ1だけで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());
}
現実には、1が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プロジェクトからこれをよく知っています、私はちょうどそこに別のスレッド間のレイヤーなしで行く方法が存在するのだろうかと思っていた –