[英]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();
...
}
}
如您所見,僅稀疏地使用構造函數來設置Loaded
和Unloaded
事件處理程序。 相反,大部分設置將推遲到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.