我有一个带有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替换为更令人兴奋的事情,它仍然有用。
答案 0 :(得分:0)
我遇到与使用ZoomBarVisibility="Visible"
属性时相同的问题。就像你说的那样,你可以使用zoomlevel来确定其中一个按钮是否有一个zoomaction。
另一个选择是创建自己的放大/缩小按钮并将它们放在地图上而不是使用内置缩放按钮。或者你可以使用完全不同的控件,在地图上(或在它下面)占用更少的空间,就像滑块控件一样。没有那么多的缩放级别(从我的头部21开始),因此构建起来并不那么难。
您是否真的想使用这些按钮而不是使用触摸屏中的手势进行放大,是否有特定原因?