【问题标题】:OnLoaded event calling again in UWP在 UWP 中再次调用 OnLoaded 事件
【发布时间】:2020-10-19 15:53:59
【问题描述】:

我正在使用 WinUI 2.5 prerelease 与 UWP 合作,并注意到 WPF 中没有发生的奇怪行为。 所以我使用TabView 控件并在其中加载Page。每次创建新标签时,都会在其中加载一个新页面(没什么花哨的)。

现在,我的页面上有一些 OnLoaded 事件。因此,当创建新选项卡并加载页面时,将调用 OnLoad 事件(应该如此),但现在当我切换回其他选项卡并再次切换到当前页面时,再次调用 OnLoaded 事件。为什么?

带 TabView 的主页面

<Page
    x:Class="TestUWPApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestUWPApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:controls="using:Microsoft.UI.Xaml.Controls"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <controls:TabView x:Name="MainTabView">
            <controls:TabView.TabItems>
                <controls:TabViewItem Header="Intelliventory"
                                      IsClosable="False" CanDrag="False">
                    <controls:TabViewItem.IconSource>
                        <controls:SymbolIconSource Symbol="Home" />
                    </controls:TabViewItem.IconSource>
                    <Frame SourcePageType="local:Page2" />
                </controls:TabViewItem>
                <controls:TabViewItem Header="Intelliventory"
                                      IsClosable="False" CanDrag="False">
                    <controls:TabViewItem.IconSource>
                        <controls:SymbolIconSource Symbol="Home" />
                    </controls:TabViewItem.IconSource>
                    <Frame SourcePageType="local:Page3" />
                </controls:TabViewItem>
            </controls:TabView.TabItems>
        </controls:TabView>
    </Grid>
</Page>  

具有 OnLoaded 事件的 Page3

namespace TestUWPApp
{

    public sealed partial class Page3 : Page
    {
        public Page3()
        {
            this.InitializeComponent();
        }

        private void Page3_OnLoaded(object sender, RoutedEventArgs e)
        {
            //This event is called every time tab is switched
        }
    }
} 

每次选定的选项卡更改为Page3 tab 时,都会调用onLoaded 事件。当第一次切换选项卡并加载页面时,应该只调用一次。

【问题讨论】:

  • 您好,如果您使用的是预发布的WinUI包,您可以在Github提问,开发者正在那里积极回复相关问题。
  • @RichardZhang-MSFT 嗨,我也问过那里,但到目前为止没有任何回应。(我认为在非预发布版本中也会发生同样的情况)
  • 你试过ChacheModes吗?public Page3() { this.InitializeComponent(); this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; }
  • @thezapper 是的,我刚试过这个,它也不起作用。加载事件被调用!有人在 github 上告诉我,这是因为控件再次加载到选项卡导航上的可视树中,并在此调用了加载事件。
  • 这对我来说感觉不好,原因 1 它不会发生在 WPF 和 2. 页面已经加载到选项卡中,因此它不应该在切换选项卡时再次调用加载事件..

标签: c# xaml uwp windows-community-toolkit winui


【解决方案1】:

每次将元素添加到 VisualTree、渲染并准备好交互时,都会引发 Loaded 事件。如果您选择 TabViewItem,TabViewItems 页面将再次添加到可视化树中,被渲染,从而再次引发 Loaded 事件。所以这种行为是设计使然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2022-01-01
    相关资源
    最近更新 更多