【问题标题】:How to make UserControl initialization only once after property is set如何在设置属性后只进行一次 UserControl 初始化
【发布时间】: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

标签: wpf xaml user-controls


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多