在我的MVVM应用程序中,我有一个带有几个标签的标签控件。每当选择一个选项卡时,该选项卡页面上的用户控件都会被加载,并且在该用户控件的构造函数中,会进行一次调用,需要一些时间才能完成。
我想更改它,以便在加载用户控件并对用户可见后进行调用。我尝试了IsVisibleChanged事件,但在我实际看到控件之前它返回Visible = true,几乎一旦我点击了标签页。
有没有办法只有在控件加载并在屏幕上显示给用户后才可以进行调用?
更新 更多信息现在的呼叫是异步呼叫。问题似乎是在完成asycn调用之后,用户控件上的网格的dataSource会更新,并且需要大约一秒钟。因此,当真正发生的事情是网格加载了一些数据时,看起来需要一秒左右才能切换标签。这就是为什么我一直在寻找一种方法来启动请求,只有在Tab键切换完成并且用户控件可见后才会触发最终的数据加载
答案 0 :(得分:1)
您应该对耗时的方法/功能进行异步调用。使用.NET 4和TPL,可以使用Task
类...
Task.Factory.StartNew(MyLittleTimeFunction);
或:
Task.Factory.StartNew(() => serviceAgent.MyFunc(myParam)).
ContinueWith(t => MyOtherFunc(myOtherParam));
答案 1 :(得分:0)
使用Loaded事件(在构造FrameworkElement并将其添加到对象树时发生。)FrameWorkElement(所有WPF控件都派生自...所以您的用户控件也是如此;)
有关详细信息,请参阅MSDN。
答案 2 :(得分:-1)
我认为这是一个使用活动的好地方。 FrameworkElement
类已提供Loaded
个事件。 Window
类和TabControl
用户控件都继承自它,因此您可以使用此事件。您所要做的就是将呼叫转移到此事件。有关简单示例,请参阅MSDN Loaded
事件页面。
编辑 @YoupTube是正确的,最好是重载用户控件事件,而不是窗口事件,因为您可以在一个页面中放置更多用户控件。