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 上接收事件。
我编写 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 上接收事件。