WPF中的Double Loaded事件

时间:2010-05-10 07:10:19

标签: wpf binding

我在将数据绑定到其他人的自定义控件值时遇到了一些困难,所以我使用“Loaded”事件来分配控件的值,但我注意到这个事件被激发了两次。

我怎样才能知道发生什么事情? (VS2008)或者可能会有任何解决方案:)

3 个答案:

答案 0 :(得分:4)

每次控件变得可见时,您的Loaded事件将会激活(基本上)两次。例如,每次切换到其选项卡时,选项卡控件上的控件都将触发其Loaded事件。

这是一个简单的解决方案:

bool m_Loaded = false;
void Loaded(object sender, RoutedEventArgs args)
{
    bool tmpLoaded = m_Loaded;
    m_Loaded = true;
    if (tmpLoaded ) return;

    // your code here...
}
祝你好运//杰瑞

答案 1 :(得分:2)

Jerry回答是每次控件变为可见时触发的Loaded事件问题的常见转变。

但我更喜欢没有连续评估繁琐标志的解决方案:只需在第一次触发时从de event中减去处理程序。

此外,通过这种方式,当控件在第一次显示后可见时,您可以附加另一个处理程序来执行代码。

    public UserControl1()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(UserControl1FirstTime_Loaded);

    }

    void UserControl1FirstTime_Loaded(object sender, RoutedEventArgs e)
    {
        Loaded -= UserControl1FirstTime_Loaded; //This handler not called again
        ...................
        //Add next line if you want code to be executed when de control becomes visible 
        //after first time.
        Loaded +=UserControl1AfterFirstTimes_Loaded;
    }

    void UserControl1AfterFirstTime_Loaded(object sender, RoutedEventArgs e)
    {
        //Code to be executed when the control becomes visible after first time
        ....
    }

答案 2 :(得分:1)

如此blog中所述,当即将呈现控件(即添加到可视树)时,会触发Loaded事件。

有几个控件会导致您的控件多次加载/卸载。例如,本机WPF TabControl仅呈现所选选项卡的内容。因此,当您选择新选项卡时,将卸载先前选定选项卡的内容。如果单击返回先前选择的选项卡,则会重新加载内容。