当用户控件首次显示在WPF中时,如何运行一些代码

本文关键字:何运行 运行 代码 控件 用户 显示 中时 WPF | 更新日期: 2023-09-27 18:25:31

我的主窗口有一个带有许多选项卡的选项卡控件。每个选项卡都有一个用户控件。在每个用户控件中,都有一个或多个数据网格,用于显示DB中的某些数据。我不想在程序启动时加载所有网格的数据。我只想在第一次显示用户控件时执行readDB数据方法。有这样的活动吗?我尝试了Loaded事件。但是is是在我的应用程序启动时触发的,而不是在我单击选项卡页面并显示用户控件时触发的。

当用户控件首次显示在WPF中时,如何运行一些代码

您可以将另一个事件附加到TabControl,而不是实际的选项卡。使用SelectionChanged事件,您可以访问已删除(隐藏)的选项卡和显示(活动)的选项卡。

然后,您需要在类中添加一个标志来检查选项卡是否已经显示。这样的东西应该行得通。

        readonly List<string> shownTabs;
        public MainWindow()
        {
            InitializeComponent();
            this.shownTabs = new List<string>();
            this.tabCtrl.SelectionChanged += tabCtrl_SelectionChanged;
        }
        void tabCtrl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if(e.AddedItems.Count == 0)
                return;
            var tabItem = e.AddedItems[0] as TabItem;
            if (tabItem == null)
                return;
            if(this.shownTabs.Contains(tabItem.Name))
                return;
            this.shownTabs.Add(tabItem.Name);
            if (tabItem == this.tab1)
            {
                //TODO : tab 1 logic
            }
            else if (tabItem == this.tab2)
            {
                //TODO : tab 2 logic
            }
        }

请注意,我使用了一个列表来保存对加载的选项卡的引用。此外,在本例中,当将第一个选项卡添加到所选内容时构建tabControl时,tabCtrl事件将触发。因此,您可能会发现在构造函数中添加事件处理程序是一个不好的地方,可能需要在另一个事件中。IE加载的事件。

希望这能有所帮助。

 <Grid>
    <TabControl SelectionChanged="TabControl_SelectionChanged_1">
        <TabItem x:Name="tabitem1" Header="abc" />
        <TabItem x:Name="tabitem2"  Header="xyz"/>
    </TabControl>
</Grid>
 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private bool tab1ItemLoaded = false;
    private bool tab2ItemLoaded = false;
    private void TabControl_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        if (tabitem1.IsSelected && !tab1ItemLoaded)
        {
            //load tab1 data
            tab1ItemLoaded = true;
        }
        else if (tabitem2.IsSelected && !tab2ItemLoaded)
        {
            //load tab2 data
            tab2ItemLoaded = true;
        }
    }
}

我希望这能给你一个想法。使用命令使用MVVM非常容易,但如果您在代码后面执行,则可以尝试TabControl 的SelectionChanged事件