【问题标题】:WP7 Timer CallBack is not fired during User Activity在用户活动期间不会触发 WP7 计时器回调
【发布时间】:2012-02-10 09:53:10
【问题描述】:

我有一个专为地图点浏览而设计的页面。我想向用户显示一个边框。此边框包含用户信息(有点像消息框)。

我使用 MVVM 模式...

我想在 3 秒后隐藏边框。一切正常(边框在 3 秒后隐藏),直到我开始使用地图控件移动。那么边框就永远不会隐藏了。

附加代码将解释更多...

视图中我的部分 XAML 代码:

<Grid>
<my:Map 
    Margin="0,0,0,0" 
    x:Name="MainMap" 
    CredentialsProvider="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    Center="{Binding MapCenter, Mode=TwoWay}"
    ZoomLevel="{Binding ZoomLevel, Mode=TwoWay}"                     
    myMapViewModel:BindingHelpers.TileSource="{Binding CurrentMap}" 
    myMapViewModel:BindingHelpers.PointsSource="{Binding Points}"
            myMapViewModel:BindingHelpers.CurrentPositionPushpin="{Binding CurrentGeoPosition}"
    myMapViewModel:BindingHelpers.KmlPointSelectedCommand="{Binding ShowSelectedKmlPointCommand}"
    Grid.Row="0"
    CopyrightVisibility="Collapsed"
    ZoomBarVisibility="Collapsed"  
            Padding="0"
    >

    <my:Map.Mode>
        <MSPCMCore:MercatorMode/>
    </my:Map.Mode>

    <TextBlock 
        Grid.Row="0" 
        x:Name="MapNameTile" 
        Text="{Binding CurrentMapName}" 
        Opacity="0.5" 
        Style="{StaticResource PhoneTextNormalStyle}"                    
                    VerticalAlignment="Top"
                    HorizontalAlignment="Left"
                    Canvas.ZIndex="2"
                    Foreground="{StaticResource PhoneAccentBrush}"

                    />
</my:Map>

<Border 
        Canvas.ZIndex="20"                        
        Background="{StaticResource PhoneAccentBrush}" 
        Opacity="0.85"
        Height="100"
        Width="430"
        VerticalAlignment="Top"
        HorizontalAlignment="Center"
        CornerRadius="15"
        Padding="15"
        Margin="0,25,0,0"
        Visibility="{Binding IsInformationPanelVisible, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"
         >
    <TextBlock 
            Style="{StaticResource PhoneTextNormalStyle}"
            TextWrapping="Wrap"
            Text="{Binding InformationPanelText}"
        />
 </Border>

来自 ViewModel 的部分代码:

public bool IsInformationPanelVisible
{
   get
   {
       return this._isInformationPanelVisible;
   }
   set
   {
       if (this._isInformationPanelVisible == value)
       {
            return;
       }

       this._isInformationPanelVisible = value;

       if (this._isInformationPanelVisible)
       {
           new Timer((state) => 
           {
                this.IsInformationPanelVisible = false;         
           }, null, 3000, 0);
       }

       DispatcherHelper.CheckBeginInvokeOnUI(() =>
       {
           RaisePropertyChanged("IsInformationPanelVisible");
       });
   }
}

我的问题是:为什么在用户触摸显示屏并移动地图的情况下它不起作用?

无法调试。

我接受了测试,似乎没有触发 Timer CallBack。

【问题讨论】:

    标签: silverlight windows-phone-7 mvvm timer mvvm-light


    【解决方案1】:

    这里有几个问题。最大的一个是你的计时器回调 lambda 中的一个错误 - 你不会在三秒后立即引发 PropertyChanged 事件,而是立即引发它。您应该在 lambda 中调用 RaisePropertyChanged(在 lambda 中提供 lambda!):

       if (this._isInformationPanelVisible)
       {
           new Timer((state) => 
           {
                this.IsInformationPanelVisible = false;        
                DispatcherHelper.CheckBeginInvokeOnUI(() =>
                {
                    RaisePropertyChanged("IsInformationPanelVisible");
                });       
           }, null, 3000, 0);
       }
    

    此外,Timer 回调 (lambda) 将在优先级低于 UI 线程的后台线程上运行 - 这是您的更新可能无法触发的另一个原因。

    当然,如果您使用DispatcherTimer,您将不会遇到这些问题 - 它始终在 UI 线程上运行。

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2015-01-24
      相关资源
      最近更新 更多