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

WCF hosted in WPF and how can i change control in MainWindow UI from wcf?

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

public static class Switcher
    {
        public static MainWindow pageSwitcher;

        public static void Switch(Page newPage)
        {
            pageSwitcher.Navigate(newPage);
        }       
    }

我这样写我的 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());
        }
    }

我想从另一台使用 WCF 的计算机远程更改页面,但它不起作用 我跟踪代码 wcf 是 运行 和响应但不做任何事情 如何访问主线程以更改 ui 页面或其他元素?

我建议您重新开始,这次将 WCF 与 WPF 应用分开。

您需要:

1) 将 WCF 与 WPF 分开 - 应该在不同的层中。

2) 将 WCF 与双工绑定结合使用 - 这样您的 WCF 服务将能够在需要时与客户端进行通信。

3) 在您的 WCF 回调协定(由客户端实现)中 - 您应该准备一个方法,用于更改本地 UI 模式。

双面装订是满足您需求的完美解决方案。

您可以了解 Duplex here

希望对您有所帮助! 埃金.

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

您应该考虑通过发布-订阅代理使用消息传递(图片链接自 MSDN):

Prism's EventAggregator. A couple of samples I cherry picked are Simplifying PRISM’s EventAggregator and Prism EventAggregator Sample.

非常符合这个要求

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