MapZoom事件未触发ZoomBar控件

时间:2011-12-23 09:03:25

标签: windows-phone-7 bing-maps

我有一个带有bing地图控件的WP7.1应用程序,我设置了ZoomBarVisibility =“Visible”,它显示加号和减号按钮来控制地图缩放。然后我通过代码和xaml添加了MapZoom事件,当按下缩放按钮时,两个事件都不会触发。如果我捏合并缩放,事件将会触发。

我已在手机和模拟器上测试了此功能,但我得到了相同的结果。我现在认为解决我的问题的唯一方法是数据绑定到ZoomLevel属性,然后在此更改时引发我自己的事件。

还有其他人遇到过这个问题吗?

以下是我的noddy代码的副本:

<phone:PhoneApplicationPage 
  x:Class="MapTest.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
  xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
  FontFamily="{StaticResource PhoneFontFamilyNormal}"
  FontSize="{StaticResource PhoneFontSizeNormal}"
  Foreground="{StaticResource PhoneForegroundBrush}"
  SupportedOrientations="Portrait" Orientation="Portrait"
  shell:SystemTray.IsVisible="True">

  <my:Map x:Name="map2" ZoomBarVisibility="Visible" ZoomLevel="{Binding ZoomLevel,   
  Mode=TwoWay}" MapZoom="map2_MapZoom_1" />
</phone:PhoneApplicationPage>

这是

背后的代码
using System;
using System.ComponentModel;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Controls.Maps;

namespace MapTest
{
public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged
{
    public MainPage()
    {
        InitializeComponent();
        map2.MapZoom += (o, args) => MessageBox.Show("Fired from annoymous delegate");
        this.DataContext = this;
    }

    private void map2_MapZoom_1(object sender, MapZoomEventArgs e)
    {
        MessageBox.Show("Fired from event");
    }


    private int _zoomlevel=50;
    public int ZoomLevel
    {
        get { return _zoomlevel; }
        set 
        { 
            _zoomlevel = value;
            RaisePropertyChanged("ZoomLevel");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        if (Deployment.Current.Dispatcher.CheckAccess())
        {
            _RaisePropertyChanged(propertyName);
        }
        else
        {
            Deployment.Current.Dispatcher.BeginInvoke(new Action<string>(_RaisePropertyChanged), propertyName);
        }
    }

    private void _RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler propertyChanged = PropertyChanged;
        if ((propertyChanged != null))
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}
}

* 建议的解决方案 **** 从其他评论看起来它是一个错误,所以我会使用我提出的解决方案,这可能会帮助其他人。

    private int _zoomlevel=50;
    private int _previousZoomLevel = 50;
    public int ZoomLevel
    {
        get { return _zoomlevel; }
        set
        {
            _previousZoomLevel = _zoomlevel;
            _zoomlevel = value;
            RaisePropertyChanged("ZoomLevel");

            if (_previousZoomLevel !=_zoomlevel && MapZoomed != null)
                MapZoomed(new MapZoomedEventArgs() { PreviousZoomLevel = _previousZoomLevel, ZoomLevel = _zoomlevel });
        }
    }

public class MapZoomedEventArgs
{
    public int PreviousZoomLevel;
    public int ZoomLevel;
}

检查previousZoomLevel的原因是属性多次触发。然后,我可以使用此事件来处理我的MapZoom事件,而不是MS版本中的支持 - 如上所述,我可以轻松地将现有的ZoomBar替换为更令人兴奋的事情,它仍然有用。

1 个答案:

答案 0 :(得分:0)

我遇到与使用ZoomBarVisibility="Visible"属性时相同的问题。就像你说的那样,你可以使用zoomlevel来确定其中一个按钮是否有一个zoomaction。

另一个选择是创建自己的放大/缩小按钮并将它们放在地图上而不是使用内置缩放按钮。或者你可以使用完全不同的控件,在地图上(或在它下面)占用更少的空间,就像滑块控件一样。没有那么多的缩放级别(从我的头部21开始),因此构建起来并不那么难。

您是否真的想使用这些按钮而不是使用触摸屏中的手势进行放大,是否有特定原因?