【问题标题】:Prevent Loaded Event when KeepAlive="True WPFKeepAlive="True WPF 时防止加载事件
【发布时间】:2017-06-09 18:50:40
【问题描述】:

我在页面上使用KeepAlive 属性,以便能够在用户离开它的状态下导航回它。

用户可以搜索公司,在附加页面中查看有关公司的更多详细信息,然后导航回处于搜索状态的搜索页面。

我还利用页面上的Loaded 事件将其设置为首先显示用户最喜欢的公司。

搜索后,当用户从详细信息页面返回时,不可避免地会触发 Loaded 事件并重置他们的搜索,返回到 Loaded 方法中描述的状态。

我的问题是 - 有没有一种方法可以在第一次加载页面时触发 Loaded 事件,但是当它是 KeptAlive 并导航回时,不会触发 Loaded 事件?

我还希望有一种方法来取消附加此行为,因为如果用户确实导航离开搜索页面(即不导航到详细信息页面),我希望该页面在下次所述用户导航到时触发 Loaded 事件它。

编辑:

var estimatingContractsPage = new EstimatingContractsPage(selectedItem); NavigationService?.Navigate(estimatingContractsPage);

【问题讨论】:

    标签: c# wpf navigationservice


    【解决方案1】:

    Loaded 事件将在每次 Page 实际加载到您的 UI 时触发。但是,如果您只创建 Page 类的单个实例,则可以使用布尔标志来确保 事件处理程序 中的代码只运行一次:

    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
            this.Loaded += Page1_Loaded;
        }
    
        private bool _isLoaded;
        private void Page1_Loaded(object sender, RoutedEventArgs e)
        {
            if(!_isLoaded)
            {
                //Your code
    
                _isLoaded = true;
            }
        }
    }
    

    另一种选择是在事件处理程序被调用后简单地取消挂钩:

    public Page1()
    {
        InitializeComponent();
        this.Loaded += Page1_Loaded;
    }
    
    private void Page1_Loaded(object sender, RoutedEventArgs e)
    {
        //Your code
        this.Loaded -= Page1_Loaded;
    }
    

    【讨论】:

    • 现实中的简单答案谢谢。我仍然不太确定我将如何处理实际导航到详细信息页面以外的其他地方 - 在这种情况下,我希望在用户回来时页面被“加载”。
    • 解决方案是知道您何时导航到另一个页面。您如何在页面之间导航?
    • 检查我如何导航的编辑。我可以在导航时检查页面名称并挂钩/取消挂钩我假设的加载事件处理程序。我可以挂钩 NavigationService.Navigating 事件,但我不确定如何检查事件的目的地..
    • 是的,例如。这只是定义条件的问题,即您可以检查任何其他条件,而不是简单地检查 _isLoaded 标志的值。重点是该事件将被引发,但您在事件处理程序中的代码只会在某些情况下执行。
    猜你喜欢
    • 2010-12-22
    • 2010-09-16
    • 2018-06-17
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多