2012-02-10 2 views
0

지도 지점 검색 용 페이지가 있습니다. 나는 사용자에게 국경을 보여주고 싶다. 이 경계선은 사용자를위한 정보를 포함합니다 (메시지 상자와 같은 것임). 내가 MVVM의 patern입니다을 사용WP7 타이머 콜백이 사용자 작업 중에 실행되지 않습니다.

...

내가 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> 

부 :

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이 해고되지 않은 것으로 보인다.

답변

2

여기 몇 가지 문제가 있습니다. 가장 큰 것은 타이머 콜백 람다의 버그입니다. 즉, 즉시 3 초 후에 PropertyChanged 이벤트를 발생시키지 마십시오. 당신은 당신의 람다 내부의 RaisePropertyChanged 호출이 있어야합니다

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

는 또한, 타이머 콜백 (람다)는 UI 스레드보다 낮은 우선 순위 인 백그라운드 스레드에서 실행됩니다 - (람다 내부 람다를주는!) 이는 업데이트가 실행되지 않는 또 다른 이유입니다.

물론 DispatcherTimer을 사용하면 이러한 문제가 발생하지 않으며 항상 UI 스레드에서 실행됩니다.

관련 문제