【问题标题】:Is there some shortcut for calling this.Invoke every time a callback needs to access the UI? Some automatic delegation to the UI thread?是否有一些调用 this.Invoke 的快捷方式,每次回调需要访问 UI 时?一些自动委托给 UI 线程?
【发布时间】:2011-04-06 11:42:36
【问题描述】:

我正在a design pattern which is a combination of MVP and MVVM.* 中开发 Windows 窗体 GUI

我正在使用代码将视图绑定到视图模型:视图订阅了 VM 的 PropertyChanged 事件。如果 Presenter 设置了 VM 的某些属性,则引发该事件并且 View 执行其回调。

所以视图中的每个回调都需要包装在this.Invoke( { ... } )中。

我希望有一种方法定义一个属性,该属性的设置器将在 UI 线程中自动调用。某种编写自动委托属性或方法的方法。

我也用 WPF 标记了这个问题,因为我使用的是 C# 4.0,所以如果 WPF 中存在这样的机制,我很乐意将它用于 Windows 窗体。

*我使用 MVVM 是因为应用程序可能会在某个阶段转换为 WPF。

【问题讨论】:

  • 你能提供一些你想要实现的伪代码吗?
  • 嗨@Jeff,感谢您的帮助,无论如何请参阅下面的答案。但如果您有任何见解,我会很高兴听到。

标签: wpf winforms user-interface c#-4.0 invoke


【解决方案1】:

我突然意识到,我正在使用的 IoC 框架,Castle Windsor,可以完全满足我的要求。我只是在表单的所有方法上附加了一个拦截器,拦截器就是这样做的:

if (invocation.InvocationTarget.InvokeRequired)
{
     invocation.InvocationTarget.Invoke(invocation.Proceed);
}
else
{
     invocation.Proceed();
}

后来我修改了上面的代码,把它放在一个带有以下签名的扩展方法中:

public void InvokeIfRequired(this Control uiObject, Action action)

【讨论】:

    【解决方案2】:

    要定义一个始终在 UI 线程上调用的属性设置器,您可以执行以下操作:

    public int MyPropertyForTheUIThread
    {
        get
        {
            return this.myRealValue;
        }
    
        set
        {
            if (this.myRealValue != value)
            {
                this.myRealValue = value;
                this.Invoke((Action)(()=>
                    {
                        // The stuff I want to do on the UI thread when this property changes.
                    });
            }
        }
    }
    

    【讨论】:

    • 它仍然迫使我在我的代码中放置大量 InvokeRequested 和 Invoke 调用,每个属性都需要大量代码。我认为有些东西可以为我节省额外的代码。
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多