WPF中托管的WCF,如何从wcf中更改MainWindow UI中的控件?

Far*_*raz 5 c# wpf wcf multithreading

我编写WCF代码并托管在WPF应用程序中。我编写了类来切换我的MainWindow以显示项目中的其他页面

public static class Switcher
    {
        public static MainWindow pageSwitcher;

        public static void Switch(Page newPage)
        {
            pageSwitcher.Navigate(newPage);
        }       
    }
Run Code Online (Sandbox Code Playgroud)

我这样写我的WCF服务:

[ServiceContract]
    public interface IAppManager
    {
        [OperationContract]
        void DoWork();
        [OperationContract]
        void Page1();
        [OperationContract]
        void Page2();
    }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class AppManager : IAppManager
    {

        public void DoWork()
        {
        }
        public void Page1()
        {
            MainWindow.pageSwitcher = new MainWindow();
            MainWindow.Switch(new Page1());
        }
        public void Page2()
        {
            MainWindow.pageSwitcher = new MainWindow();
            MainWindow.Switch(new Page2());
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想从另一台装有WCF的计算机上远程更改页面,但它不起作用,我跟踪了wcf的运行和响应代码,但不执行任何操作,如何访问主线程来更改ui页面或其他元素?

slu*_*ter 2

您当前的解决方案很不寻常,但 WCF 可以托管在 WPF 应用程序中。但是,您永远不应该尝试直接从 WCF 服务操作 UI - 首先您将遇到跨线程问题。

\n\n

您应该考虑做的是通过 pub-sub 代理使用消息传递(图片链接自 MSDN):

\n\n

在此输入图像描述

\n\n

Prism 的 EventAggregator非常适合这个要求。我精心挑选的几个示例是Simplifying PRISM\xe2\x80\x99s EventAggregatorPrism EventAggregator Sample

\n\n

使用它的方式是服务注册事件然后引发它们,WPF 订阅这些事件并处理它们。这样您还可以指定是在 UI 线程还是后台线程上接收事件。

\n