2013-04-01 54 views
1

看起來好像在XAML中的UserControl對象中沒有IsLoaded屬性,即使Loaded事件存在。WinRT中的UserControl的IsLoaded屬性

MSDN page on IsLoaded告訴它應該在那裏,因爲UserControl派生自FrameworkElement

所以我想它被刪除在XAML(文檔是爲WPF)。但我不相信他們剛剛在WinRT中刪除它,他們一定已經用其他東西替換了它?

所以,問題: 如何獲得對IsLoaded布爾中的WinRT一個UserControl的?

當然,通過在Loaded事件上註冊回調,每個用戶控件都可以通過手工完成,但這對於這樣一個簡單的事情來說是一種痛苦。

回答

3

Silverlight中也沒有FrameworkElement.IsLoaded,WinRT比Silverlight更接近WPF。

至於爲什麼它被刪除,我可以讓基於WPF屬性的documentation一個受過教育的猜測:

從新建FrameworkElement的,這個屬性開始了 假的,之後它仍然是正確的設置爲true,即使隨後通過代碼從連接的邏輯樹中刪除了元素 。當元素爲 加載到展示引擎中時,通過一般呈現邏輯設置爲true 狀態。

基本上,在WPF中的財產有時是錯誤。一個控件可以加載(並激活它的事件)多次,並在此期間卸載。 WPF IsLoaded屬性可以說,即使它不是真的,控件也會被加載。這是...非常糟糕。

他們可能刪除它,而不是修復它,因爲這些原因中的至少一個:

  • 他們不想內WPF打破兼容老版本,還是有其作用在不同WPF屬性VS SL/WinRT的
  • 跟蹤判斷一件事情是加載或不很困難,很容易出錯,因此是極其危險的
  • 查詢控件的加載狀態可能是不好的做法/個壞主意無論如何

如果你真的想自己實現它,那麼至少聽Unloaded以及Loaded。但我認爲,根據你想要做的事情,可能會有更好的解決方案。

+0

很好,謝謝你的廣泛見解。 – Mic

+0

很高興我能幫忙:-) –

1

框架的Windows運行時版本中沒有IsLoaded屬性。正如您所指出的那樣,您提供的鏈接不適用於Windows運行時。爲此,請參閱此MSDN鏈接:FrameworkElement

Loaded事件似乎是做你所問的唯一方法。

+0

你知道背後的理由嗎?我看不到刪除此屬性的好理由。 – Mic

+0

@Mic - 不,對不起,我不知道爲什麼。 –

2

A「加載」控件只是一個是在視覺樹,所以你可以檢查是否有你的控制和使用VisualTreeHelper應用的RootVisual之間的路徑,但它可能不會是非常有效的,我會仍然建議處理事件。如果你真的需要它,你可以實現一個附加屬性/行爲,它會給你一個可綁定的IsLoaded屬性。

+0

好的,看起來我會堅持自己設置'IsLoaded',但這是一種痛苦,對我來說沒有任何意義。無論如何,不​​要太認真:)順便說一下,它也保證所有的孩子也都在視覺樹中,對吧? – Mic

+0

一旦加載的事件被觸發,假設可視樹已被分析並加載,這是正確的。 –