导航后相关性属性恢复为默认值
本文关键字:默认值 恢复 属性 相关性 导航 | 更新日期: 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方法