Событие MapZoom не запускается для элементов управления ZoomBar - PullRequest
1 голос
/ 23 декабря 2011

У меня есть приложение 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 на что-то более захватывающее, и оно все равно будет работать.

1 Ответ

0 голосов
/ 23 декабря 2011

У меня та же проблема, что и у вас при использовании свойства ZoomBarVisibility="Visible". Подобно тому, что вы сказали, вы можете использовать уровень увеличения, чтобы определить, было ли выполнено масштабирование одной из кнопок.

Еще один вариант - создать собственные кнопки увеличения / уменьшения и разместить их на карте вместо использования встроенных кнопок масштабирования. Или вы можете использовать совершенно другой элемент управления, который занимает меньше места на карте (или под ним), как элемент управления ползунок. Существует не так много уровней зумирования (от моей головы 21 для bing), чтобы их было не так сложно построить.

Есть ли конкретная причина, по которой вы действительно хотели бы использовать эти кнопки вместо увеличения с помощью жестов на сенсорном экране?

...