C# UWP新应用程序视图

C# UWP新应用程序视图,c#,xaml,uwp,C#,Xaml,Uwp,我正在构建一个新的应用程序,它在桌面模式下,严重依赖于具有许多窗口的结构 在WPF中,管理起来非常简单。但在UWP中,由于mvvm非常多,我几乎忘记了适应不同的ui线程。我现在正在创建新的构造函数和句柄属性,改变了很多我在单ui线程模式下不需要的地方 在应用程序当前ui线程上创建新的applicationview有什么神奇的方法吗 我希望这里有一些大师不可能更改新窗口的线程 也许您可以使用EventAggregator()之类的东西在Windows之间进行通信?EventAggregator可以

我正在构建一个新的应用程序,它在桌面模式下,严重依赖于具有许多窗口的结构

在WPF中,管理起来非常简单。但在UWP中,由于mvvm非常多,我几乎忘记了适应不同的ui线程。我现在正在创建新的构造函数和句柄属性,改变了很多我在单ui线程模式下不需要的地方

在应用程序当前ui线程上创建新的applicationview有什么神奇的方法吗


我希望这里有一些大师

不可能更改新窗口的线程

也许您可以使用EventAggregator()之类的东西在Windows之间进行通信?EventAggregator可以帮助隐藏不同线程之间通信的一些细节

一个想法是,每个窗口创建自己的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));
        }
请记住,Window1和Window2中的EventAggregator都有一组共享的订阅服务器

然后,当您想从Window2向Window1发送消息时,只需调用Publish。此代码来自Window2中的单击按钮:

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        this.EventAggregator.Publish(new Message("hello from second view"));
    }
EventAggregator确保Window1在其自己的UI线程中接收消息。因此Window1只需更新UI即可:

    public void Handle(Message message)
    {
        this.Message.Text = message.Text;
    }
下面是发布方法的一个切中要害的实现:

        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());
        }
公共无效发布(TMessage消息)
{
var messageType=GetEventType(消息);
foreach(订阅服务器中的var订阅服务器)
{
var handler=subscriber.Item2;
if(messageType.IsInstanceOfType(处理程序))
{
var dispatcher=subscriber.Item1;
dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>
{
((ISubscriber)处理程序).HandleMessage(消息);
});
}
}
}
私有静态类型GetEventType(T参数)
{
返回typeof(isSubscriber).MakeGenericType(args.GetType());
}
实际上,应该确保使用weakreference或其他一些功能来确保GC能够清理东西


可以通过Gist获得答案。

对,这就是你匆忙阅读问题的答案。当然,每个
CoreWindow
都在自己的线程中运行,具有自己的输入处理和消息调度。它是视图中运行在同一线程上的
UIElement
s的层次结构。对不起,我看不出有什么理由要单独使用ui线程。Wpf和winforms在单个UI线程上可以很好地处理所有这些问题。我从其他uwp项目中很清楚这一点,我只是想知道是否有一种方法可以绕过这一点,而不需要在不同线程之间设置一层
    public void Handle(Message message)
    {
        this.Message.Text = message.Text;
    }
        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());
        }