У меня есть приложение WP7.1 с включенным элементом управления картой Bing, и я установил ZoomBarVisibility = "Visible", который показывает кнопки плюс и минус для управления масштабированием карты. Затем я добавил событие MapZoom через код и через xaml, и ни одно событие не будет срабатывать при нажатии кнопок масштабирования. Если я ущипну и увеличу масштаб, события начнут срабатывать.
Я проверил эту функцию на телефоне и эмуляторе и получил те же результаты. Теперь я думаю, что единственный способ решить эту проблему - привязать данные к свойству ZoomLevel, а затем вызвать мои собственные события, когда это изменится.
Кто-нибудь еще сталкивался с этой проблемой?
Ниже приведена копия моего кода:
<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;
}
Причина проверки предыдущего ZoomLevel заключается в том, что свойство срабатывает несколько раз. Затем я могу использовать это событие для обработки своего события MapZoom, а не для резервного копирования в версии MS - и, как уже упоминалось, я могу легко заменить существующий ZoomBar на что-то более захватывающее, и оно все равно будет работать.