2012-01-27 14 views
-1

在我的MVVM应用程序中,我有一个带有几个选项卡的选项卡控件。每当选中某个选项卡时,该选项卡页面上的用户控件就会被加载,并且在该用户控件的构造函数中进行调用,这需要花费一点时间才能完成。在标签页上的用户控件可见后执行操作

我想对其进行更改,以便在用户控件加载并对用户可见后进行调用。我尝试了IsVisibleChanged事件,但在我实际看到控件之前,它几乎一次单击该选项卡就返回Visible = true。

有没有一种方法可以在控件加载完成后才能进行调用,并在屏幕上向用户显示?

更新: 更多信息现在的呼叫是异步呼叫。问题似乎是,在asycn调用完成后,用户控件上的网格的dataSource被更新,并且需要一秒左右的时间。因此,看起来只需花费一秒左右的时间来切换标签,而真正发生的情况是网格加载了一些数据。这就是为什么我正在寻找一种方式来启动请求,只有在制表符切换完成并且用户控件可见后才触发最终的数据加载

回答

1

您应该对耗时的方法/函数进行异步调用。在.NET 4和TPL这是使用Task类很容易实现......

Task.Factory.StartNew(MyLittleTimeFunction); 

或:

Task.Factory.StartNew(() => serviceAgent.MyFunc(myParam)). 
    ContinueWith(t => MyOtherFunc(myOtherParam)); 
+0

谢谢Dean。现在的通话是异步通话。这个问题似乎是,在asycn调用完成后,用户控件上一个网格的dataSource被更新,并且需要一秒左右的时间。因此,看起来只需花费一秒左右的时间来切换标签,而真正发生的情况是网格加载了一些数据。这就是为什么我正在寻找一种方式来启动请求,只有在制表符切换完成并且用户控件可见后才会触发最终的数据加载。我用这个信息更新了我的问题。 – Flack 2012-01-27 20:26:42

0

使用Loaded事件(发生在FrameworkElement被构建并添加到FrameWorkElement的所有对象树(所有WPF控件都派生自...所以您的用户控件以及;)

有关更多信息,请参阅MSDN

-1

我认为这是一个使用活动的好地方。 FrameworkElement类已经提供了一个Loaded事件。 Window类和TabControl用户控件都从它继承,因此您可以使用此事件。您只需将呼叫转移至此活动即可。有关简单示例,请参阅MSDN Loaded事件页面。

编辑 @YoupTube是正确的,最好重载用户控件事件,而不是窗口事件,因为你可以把更多的用户控件放在一个页面中。

+0

-1不要使用它的窗口上,而在用户控件本身。这就是他所要求的。并且是更好的面向对象设计;) – 2012-01-27 19:56:21

+0

@YoupTube你是对的,我更新了我的答案。 – vlad 2012-01-27 20:03:11

相关问题