簡體   English   中英

在InitializeComponent期間WPF獲取控件空引用

[英]WPF Getting Control null reference during InitializeComponent

所以我在Window的構造函數中的InitializeComponent方法調用正在運行XML並添加控件並將它們插入到它們的事件中。

因此,當其中一個控件的屬性發生更改時,它會調用訂閱該事件的Method。 該方法引用尚未構建的控件。

為什么這會按此順序發生? 它在WinForms中有效,因為在創建所有控件之后,事件才會被激活。 有沒有辦法在WPF中強制執行此操作?

我看到的其他解決方案是

  • 我需要在初始化后訂閱事件。

  • 每當我處理一個控件時,我都需要檢查null。

我也遇到了這個問題,並通過在null檢查中包含訪問空控件的行來解決它。 這似乎是一個黑客的解決方法。

我認為WPF通過在InitializeComponent()期間調用Checked事件來嘗試提供幫助,以確保根據復選框的初始狀態執行任何UI邏輯(例如顯示/隱藏相關組件)。 我測試默認情況下取消選中Checkbox,並且未調用事件處理程序,即使我已將其連接到Checked和Unchecked事件。 我甚至在一個空白的WPF項目中重現了這一點,屏幕上有一個Checkbox,它的行為相同。

此默認行為的問題顯然是某些其他組件尚未初始化。 我認為WPF應該等到所有組件都被初始化,然后默認觸發Checked事件。 這可能不會被視為錯誤,但無論如何我都會在相關的MSDN頁面上添加注釋...

這是一個無線電按鈕上的Checked事件。 當我從xaml中刪除Checked =“true”時,問題就消失了。 (雖然在Window啟動時會檢查它)。 不確定這里發生了什么,但至少我沒有必要改變任何重要的東西來修復它......

您應該能夠檢查窗口上的IsInitialized或IsLoaded屬性,以驗證它是否已完成初始化/加載。 否則,您需要檢查null或在后面的代碼中添加事件訂閱(在InitializeComponent之后)。

此外,您可以調整訪問元素的方式。 例如,如果你有類似的東西:

<ListBox x:Name="listBox" SelectionChanged="OnListBoxSelectionChanged" />

然后在您的代碼中,您可以通過以下幾種方式獲取列表框:

private void OnListBoxSelectionChanged(object sender, SelectionChangedEventArgs e) {
    ListBox lb = this.listBox; // May be null
    ListBox lb = sender as ListBox; // Should never be null
    ListBox lb = e.Source as ListBox; // Same as sender in this case
    ListBox lb = e.OriginalSource as ListBox; // Always the element that started the event (if handler is not attached directly to ListBox).
    // ... Do Something ...
}

我有同樣的問題,我認為這是一個錯誤。 我發現了一個解決方法:我從Xaml中刪除了'Ischecked'並在init之后將其設置在后面的代碼中

在初始化可以檢查並設置為檢查為初始值的子控件時,Window Control將觸發Checked事件。

我強烈認為這是一個錯誤。 事實上,它從MFC程序集中深處觸發NullReferenceException應該足以預期這是非預期的行為。

考慮到Xaml編輯器在Control部分類中創建處理函數,如果此類未完成構造,則無法處理事件。 我不認為為控件啟動一個已檢查的事件,你的設置初始化為檢查似乎是正確的。

我的意思是,如果您將其初始狀態設置為未選中,是否應該觸發未經檢查的事件?

是否有任何控件使用雙向數據綁定? 我遇到過這個問題,我將文本框綁定到ViewModel上的屬性。 ViewModel初始化觸發INotifyPropertyChanged直到綁定控件,這反過來導致文本框的TextChanged事件觸發。 我的短期解決方法是將事件訂閱移動到Loaded事件窗口,但就像你說的那樣,這是一種痛苦。 我需要重構代碼以更改我的對象初始化的順序,以便在ViewModel之前創建WPF視圖(即窗口和用戶控件)。 然后我將能夠將事件處理程序注冊移回XAML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM