如何在设置属性后只进行一次 UserControl 初始化
Posted
技术标签:
【中文标题】如何在设置属性后只进行一次 UserControl 初始化【英文标题】:How to make UserControl initialization only once after property is set 【发布时间】:2013-08-23 19:22:36 【问题描述】:代码:
public partial class MyControl : UserControl
int size = 8;
public int Size
get return size;
set size = value; Initialize();
public MyControl()
InitializeComponent();
Initialize();
void Initialize()
// ...
XAML:
<local:MyControl"/>
或:
<local:MyControl Size="10"/>
当在 XAML 中设置 Size
属性时,Initialize
被调用两次。如果我从InitializeComponent
中删除Initialize
调用,则Initialize
会从Size
setter 调用一次。但在这种情况下,如果 XAML 中没有设置 Size
,则根本不会调用 Initialize
。
有没有办法编写初始化函数,在所有控件属性(如果有)从 XAML 设置之后执行一次?
【问题讨论】:
虽然您可以使用Loaded
事件,但它仍然可以被多次调用(事件本身,以及您的函数)。如果您只希望您的函数运行一次,则可能有一个 bool 类成员来检测该函数是否已被调用并忽略该函数的任何未来调用?类似于:This
【参考方案1】:
您可以在Loaded
事件处理程序中调用Initialize
方法:
public partial class MyControl : UserControl
int size = 8;
public int Size
get return size;
set size = value;
public MyControl()
InitializeComponent();
Loaded += (o, e) => Initialize();
void Initialize()
// ...
为了确保Initialize()
方法只被调用一次,尽管Loaded
可能会被多次触发,请像这样分离事件处理程序:
public MyControl()
InitializeComponent();
Loaded += MyControlLoaded;
private void MyControlLoaded(object sender, RoutedEventArgs e)
Loaded -= MyControlLoaded;
Initialize();
【讨论】:
以上是关于如何在设置属性后只进行一次 UserControl 初始化的主要内容,如果未能解决你的问题,请参考以下文章
不支持在 UserControl 上设置 Template 属性
如何在初始化期间访问 UserControl 的 XAML 集属性?