如何在设置属性后只进行一次 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 集属性?

UserControl:如何转换依赖属性并绑定到结果

将 UserControl 属性设置为不显示在 VS 属性窗口中

C# UserControl 可见属性

如何使用自定义内容定义 UserControl?