2012-01-27 21 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

相關問題