2014-05-06 113 views
0

我正在創建一個winRt應用程序。其中我有一個Home.xaml頁面,其中有一個叫做Market.xaml的頁面。所以對於捕捉模式,重複相同的代碼。如何避免構造函數在頁面定義兩次時調用兩次

現在我itemListView(用於搶購)和itemGridView(全視圖)都有此頁面(市場)

<views:Market x:Name="viewMarket"/> 

而這個頁面的構造函數調用了兩次,我不願意。

所以我使用一些標誌類的東西或一些更好的方法在那裏。

感謝

回答

0

那麼,讓我們來談談這個:

XAML基本上是一個變化的語法爲C#。所以,當XAML引用像您的意見的控件:市場與<Views:Market />,你實際上在這兩個地方像new Views.Market()東西。基本上,兩次調用該類。如果構造函數不會兩次啓動,則時間 - 空間連續體將分裂成一半。狗和貓住在一起,整個9碼。

但是,這裏更基礎的是,C#中的構造函數或XAML類的目的是什麼?是做昂貴的事情,你不想重複?不。原因是因爲在UI線程被釋放並允許呈現控件之前,構造函數的完成是必需的。由此產生的效果是UI掛起。

此外,C#構造函數是一種同步方法。它不能正確地調用或保持異步操作。這意味着應該立即調用長時間運行或昂貴的任務,不應該在構造函數中調用,因爲它也會要求它們同步和UI阻塞。正是由於這兩點,我懷疑你的構造函數被濫用了。

該解決方案位於XAML框架中。 XAML頁面管道包含構造函數(因爲它是一個C#類,它們都擁有它),但它也包含一個Loaded事件。在許多情況下,填充頁面控件所需的努力工作在Loaded處理程序中。這允許頁面正確呈現,然後啓動將最終並異步更新控件內容的長時間運行操作。

在WinRT中,頁面管道還在基礎中包含一個OnNavigatedTo()虛擬方法,您可以將其重寫爲相同的效果。在覆蓋中,您可以包括與服務交談,從文件中反序列化或者使界面工作所需的任何工作等艱苦的工作。 Loaded事件和重寫都可以是異步的,並且都不會阻止通過凍結構造函數來進行呈現。

但是,有一件事要考慮,因爲我們是在C#和相當常見的模式稱爲單,允許我們在兩個不同的上下文,但沒有創建一個全新的類引用類型。這是通過將類構造函數設爲私有的,但暴露了一個通常稱爲實例的公共屬性,它在某個靜態位置返回一個單獨的共享實例。

這可能已經解決了您的問題。然後,再次,這可能不是你需要的。假設你已經知道所有這些,快速的答案是你不能阻止構造函數,因爲構造函數對於創建任何類的新實例化都是必要的,包括XAML視圖。相反,無論你試圖阻止雙重身份,都可能需要結合上述討論。卸載的方法和靜態引用以防止重複工作。

事情是這樣的:

public class Market : UserControl 
{ 
    public Market() 
    { 
     Loaded += Market_Loaded; 
    } 

    static bool AlreadyLoaded = false; 
    void Market_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (AlreadyLoaded) 
      return; 
     AlreadyLoaded = true; 
     // TODO: your work 
    } 
} 

但是因爲靜態變量的作用域太大,可能無法爲你做它。相反,您可以控制是否使用添加到控件的依賴屬性執行大操作。將布爾依賴屬性設置爲false時,第二個控件知道不要執行某些操作。當它設置爲true時,第一個知道繼續。等等。這可以防止未來所有視圖或用戶控件在應用程序中的使用,因爲它們不應該運行,因爲上述解決方案中的靜態屬性。再一次,這可能是完美的。

祝你好運!