2017-02-17 5 views
2

私はデスクトップモードで、多くのウィンドウを持つ構造に大きく依存する新しいアプリケーションをビルドしています。UWP新しいアプリケーションビュー

WPFでは、管理が非常に簡単です。しかし、UWPで私は非常にmvvmのために異なるUIスレッドに適応することで私の心をほとんど失っています。私は今、新しいコンストラクタを作っていて、私はシングルUIモードでは必要ないたくさんの場所でpropertychangedを処理しています。

アプリの現在のUIスレッドに新しいアプリケーションビューを作成するいくつかの魔法の方法はありますか?

私はそれが新しいウィンドウのスレッドを変更することはできません

+0

これは、あなたが急に質問を読むために得られるものです。もちろん、それぞれのCoreWindowは独自のスレッドで実行され、独自の入力処理とメッセージディスパッチが行われます。同じスレッド上で実行される、ビュー内の 'UIElement'の階層です。ごめんなさい。 – IInspectable

+0

私は別々のUIスレッドになる理由はありません。 Wpfとwinformsはこれをすべて単一のUIスレッドでうまく処理します。私は他のuwpプロジェクトからこれをよく知っています、私はちょうどそこに別のスレッド間のレイヤーなしで行く方法が存在するのだろうかと思っていた –

答えて

0

いくつかの達人がここにあります願っています。

多分、あなたは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から入手できます。

関連する問題