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