簡體   English   中英

是否首選在其Loaded事件處理程序中初始化WPF用戶控件?

[英]Is it preferred to initialize a WPF user control in its Loaded event handler?

假設我有一個WPF用戶控件,如下所示:

public partial class SensorSideView
{
    public SensorSideView()
    {
        InitializeComponent();

        Loaded += SensorSideView_Loaded;
        Unloaded += SensorSideView_Unloaded;
    }

    void SensorSideView_Loaded(object sender, RoutedEventArgs e)
    {
        foreach (var section in SensorSideViewController.CurrentSideview.Sections)
            LoadSection(section);
        ...
    }

    void SensorSideView_Unloaded(object sender, RoutedEventArgs e)
    {
        ClearGui();
    }

    private void LoadSection(Section sec)
    {
        var section = new SectionView(sec);
        section.MouseEnter += ucSection_MouseEnter;
        section.MouseLeave += ucSection_MouseLeave;
        section.MouseLeftButtonDown += ucSection_MouseLeftButtonDown;
        section.Unloaded += ucSection_Unloaded;
        section.Loaded += ucSection_Loaded;
        SectionsCanvas.Children.Add(section);
    }

    private void ClearGui()
    {
        foreach (Section sec in SectionsCanvas.Children)
        {
            sec?.RemoveEventHandler();
        }
        SectionsCanvas.Children.Clear();

        ...
    }
}

如您所見,僅稀疏地使用構造函數來設置LoadedUnloaded事件處理程序。 相反,大部分設置將推遲到Loaded事件處理程序。

我想知道,這是WPF中的常見或推薦模式嗎? 我是否不能像通常使用其他C#類那樣在控件的構造函數中一次初始化控件,而不是每次用戶打開控件時都必須對其進行初始化?

我問的原因是因為我繼承了一個非常普遍的項目。

我在某處讀到WPF對象可以在后台由框架重新使用,這就是為什么我不願進行根本性更改並將初始化邏輯從Loaded處理程序移動到構造函數的原因。

WPF中用於構造復雜的用戶控件及其實例變量的一般准則是什么?


這是我對OP的問題的評論的摘要


您最好將其分為兩個問題-一個是延遲問題,另一個是最佳實踐。

是否首選在其Loaded事件處理程序中初始化WPF用戶控件?

與大多數情況一樣,這取決於。

我之所以喜歡Loaded不是構造函數init的原因之一是,在前者中執行的代碼知道控件現在已完全布局並且可見-如果您需要知道元素的位置,則很有用。 [1]

不將內容放入構造函數的另一個好理由是,它將在實例化控件后立即執行,而不是在可見時執行。

如果您具有復雜的控件層次結構,其中每個控件在構造函數中都有其初始值,則實例化樹中的第一個控件可能會花費大量時間。

延遲

半秒或更長時間

根據您發布的代碼,我不確定為什么會遇到這種延遲。 您似乎沒有做任何特別的事情。 就像我說的那樣, “您最好將其分為兩個問題-一個是延遲問題,另一個是最佳實踐”

[1] https://msdn.microsoft.com/zh-CN/library/system.windows.frameworkelement.loaded(v=vs.110).aspx

暫無
暫無

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

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