导航后相关性属性恢复为默认值

本文关键字:默认值 恢复 属性 相关性 导航 | 更新日期: 2023-09-27 17:57:43

我在这里遗漏了一些非常明显的东西,但就是无法解决:(

我有一个2页的windows存储应用程序,它有一个名为Seconds的Dependency Property。如果单击启动按钮,计时器将启动,Seconds的值将按预期减小但是,如果我导航到Page2并再次返回到MainPage,则尽管实际值是正确的,但DP在UI中被重置为默认值。

我可以通过在_timer.tick事件上设置断点来看到这一点——Seconds DP不在其默认值,但随着计时器仍在运行,它会按预期减少。我希望这反映在UI中有什么需要帮忙的吗?

主页.xaml

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <StackPanel>
        <Button x:Name="btnNav" Content="Page 2" Width="150" Height="60" Click="btnNav_Click"></Button>
        <Button x:Name="btnStart" Content="Start" Width="150" Height="60" Click="btnStart_Click"></Button>
    </StackPanel>
    <StackPanel Grid.Column="1">            
        <TextBlock x:Name="txtSeconds" FontSize="25" Text="{Binding Path=Seconds}" />
    </StackPanel>
</Grid>

主页.cs

 public sealed partial class MainPage : Page
 {
    private static DispatcherTimer _timer;
    public MainPage()
    {
        this.InitializeComponent();
        Loaded += (s, args) =>
            {

                if (_timer == null)
                {
                    _timer = new DispatcherTimer();
                    _timer.Interval = TimeSpan.FromMilliseconds(1000);
                    _timer.Tick += (sender, e) =>
                        {                                
                            Seconds--;
                        };
                }
                this.DataContext = this;
            };
    }

    public int Seconds
    {
        get { return (int)GetValue(SecondsProperty); }
        set { SetValue(SecondsProperty, value); }
    }
    // Using a DependencyProperty as the backing store for Seconds.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SecondsProperty =
        DependencyProperty.Register("Seconds", typeof(int), typeof(MainPage), new PropertyMetadata(100));

    private void btnNav_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(Page2));
    }
    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        _timer.Start();
    }
}

Page2.xaml

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <AppBarButton Icon="Back" Click="AppBarButton_Click"></AppBarButton>
</Grid>

Page2.cs

public sealed partial class Page2 : Page
{
    public Page2()
    {
        this.InitializeComponent();
    }
    private void AppBarButton_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(MainPage));
    }
}

导航后相关性属性恢复为默认值

如注释所述:

DP中没有问题。当您导航回同一页面时,页面为重新创建。您可以通过在MainPage上放置断点来验证构造函数。自从导航回主页后,您还没有再次启动计时器,因此GUI中没有更新。

对于您的账单

_计时器是静态的。

这根本没有改变。由于定时器是静态的,在第二次加载的情况下不会为空,所以Tick事件永远不会挂接到MainPage的第二个实例。

MainPage的第一个实例的Tick事件被命中第一个实例永远不会被破坏,因为您将计时器设置为静态会导致内存泄漏。所以,它仍然在递减第一个实例的Seconds值,而不是当前实例

Tick事件挂钩移动到null检查之外,您将看到GUI将更新,但从100开始,因为新实例的默认值为100。

 if (_timer == null)
 {
     _timer = new DispatcherTimer();
     _timer.Interval = TimeSpan.FromMilliseconds(1000);
 }
 _timer.Tick += (sender, e) =>
            {                                
               Seconds--;
            };

如注释中所述,您可以向前导航到MainPage的新实例,因此它有自己的(默认)DP值。

我想你正在寻找帧的GoBack方法