WPF用户控件的加载事件不止一次触发

Muh*_*tar 34 c# wpf user-controls

要在WPF中实现基于选项卡的环境,我们需要将表单转换为用户控件,但是在执行此操作时,将Loaded调用用户控件的事件两次.

在互联网上搜索时,其他人也指出了这个问题.我们怎样才能确保只调用一次加载的事件?因为当它被多次调用时,我们的控件的初始化会多次发生.

Cod*_*ked 42

正如本博客中所解释的,当即将呈现控件(即添加到可视树)时,会触发Loaded事件.

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

一个解决方法是使用布尔值来标记您是否已经按照其他人的建议初始化了控件.或者,您也许可以使用Initialized事件.

  • 我使用 TabControl 的 `ItemsSource` 来绑定多个选项卡,并使用 `DataTemplate` 将 ViewModel 绑定到选项卡视图。在我的例子中,不仅 `Loaded` 事件再次被触发,标签视图的 **constructor** 也被再次调用。每次切换选项卡时,WPF 似乎都在完全重新创建我的选项卡控件。 (2认同)

Gle*_*den 18

您的路由事件处理程序可以(并且应该)从Loaded钩子中删除它自己的第一件事.

public class MyClass : Window
{
    public MyClass()
    {
        Loaded += MyLoadedRoutedEventHandler;
    }

    void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
    {
        Loaded -= MyLoadedRoutedEventHandler;
        /// ...
    }
};
Run Code Online (Sandbox Code Playgroud)

  • @RichardHammond因为,您可以在什么早先机会放心地确信该事件确实成功触发了?您还建议将清除内容放在哪里? (2认同)