导航后,依赖属性恢复为默认值

时间:2014-04-10 16:18:24

标签: c# xaml windows-store-apps

我在这里遗漏了一些非常明显但却无法解决的问题:(

我有一个2页的Windows应用商店,其中Dependency Property名为Seconds。 如果单击开始按钮,计时器将启动,Seconds的值将按预期减少 但是,如果我导航到Page2并再次返回MainPage,则尽管实际值正确,但DP仍会在UI中重置为默认值。

我可以通过在_timer.tick事件上设置一个断点来看到这一点,Seconds DP不是默认值,但是随着计时器仍在运行而按预期递减。我想在UI中反映出这一点 有什么帮助表示赞赏吗?

MainPage.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>

MainPage.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));
    }
}

2 个答案:

答案 0 :(得分:1)

如评论中所述:

  

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

您的陈述

  

_timer是静态的。

什么都没改变。由于timer是静态的,并且在第二次加载时不会为null,因此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--;
            };

答案 1 :(得分:0)

如评论中所述,您可以向前导航到主页的新实例,因此它具有自己的(默认)DP值。

我猜您正在寻找Frame {/ 3>的GoBack方法