2017-02-17 2 views
2

데스크톱 모드에서 많은 윈도우가있는 구조에 크게 의존하는 새 응용 프로그램을 빌드하고 있습니다.UWP 새 응용 프로그램보기

WPF에서는 관리하기가 너무나 간단합니다. 하지만 UWP에서 나는 매우 많은 mvvm으로 인해서 다른 UI 스레드에 적응하면서 내 마음을 거의 잃어 가고 있습니다. 나는 현재 새로운 생성자를 만들고 있으며, 단일 UI 스레드 모드에서는 필요없는 많은 장소에서 propertychanged를 처리합니다.

애플 리케이션의 현재 응용 프로그램에 새로운 applicationview를 만드는 마법의 방법이 있습니까?

나는 거기에 어떤 전문가가 여기에 있습니다

+0

바로 당신이 급하게 질문을 읽는 것입니다. 예, 물론, 각각의 'CoreWindow'는 고유 한 입력 처리 및 메시지 전달을 통해 자체 스레드에서 실행됩니다. 동일한 스레드에서 실행되는 뷰 내부의 'UIElement'계층 구조입니다. 죄송합니다. – IInspectable

+0

나는 분리 된 UI 스레드가 될 이유가 없다. Wpf와 winforms는이 모든 것을 단일 UI 스레드에서 잘 처리합니다. 나는 다른 uwp 프로젝트에서 이것을 잘 알고 있으며, 다른 스레드 사이의 레이어없이이 문제를 해결할 수있는 방법이 있는지 궁금합니다. –

답변

0

그것은 새로운 윈도우의 스레드를 변경할 수 없습니다 바랍니다.

어쩌면 당신은 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를 통해 제공됩니다.

관련 문제