C# 限制arcgis.net SDK 100.1缩放级别

C# 限制arcgis.net SDK 100.1缩放级别,c#,maps,arcgis,arcgis-runtime-net,C#,Maps,Arcgis,Arcgis Runtime Net,我正在使用.NET的ArcGIS运行时SDK 100.1.0。我有一个移动地图包(.mmpk)矢量地图,希望限制MapView中的最大和最小缩放。我尝试跟踪MapScale属性并将其设置为: ((INotifyPropertyChanged)MyMapView).PropertyChanged += (sender, args) => { args.PropertyName; var s = MyMapView.MapScale; i

我正在使用.NET的ArcGIS运行时SDK 100.1.0。我有一个移动地图包(.mmpk)矢量地图,希望限制MapView中的最大和最小缩放。我尝试跟踪MapScale属性并将其设置为:

((INotifyPropertyChanged)MyMapView).PropertyChanged += (sender, args) =>
    {
        args.PropertyName;
        var s = MyMapView.MapScale;
        if(s < 500)
            MyMapView.SetViewpointScaleAsync(700);
        if (s > 16500000)
            MyMapView.SetViewpointScaleAsync(16500000);
    };
((INotifyPropertyChanged)MyMapView)。PropertyChanged+=(发件人,参数)=>
{
args.PropertyName;
var s=MyMapView.MapScale;
如果(s<500)
MyMapView.SetViewpointScaleAsync(700);
如果(s>16500000)
MyMapView.SetViewpointScaleAsync(16500000);
};
这是可行的,但贴图在低/高缩放级别时会出现抖动,因为它尝试平滑缩放,而我不知道如何停止活动的缩放任务。正确的方法是什么?

简单的方法 如果只想设置最小比例和最大比例,则具有和属性。将代码替换为以下内容:

MyMapView.Map.MaxScale = 700;
MyMapView.Map.MinScale = 16500000;
艰难的道路 你可能不需要这个!使用上面列出的简单方法,除非你有很好的理由去做更复杂的事情

如果出于某种原因,你真的想跟踪比例变化,然后自己改变比例,你应该用另一种方式。目前您正在收听的是
属性更改
,内容太广泛了。一种效果是,当比例发生变化时,您的事件处理程序运行,执行异步缩放,在完成之前生成比例变化,调用您的事件处理程序,执行异步缩放,在完成之前生成比例变化,调用您的事件处理程序,我可以继续说下去。字面上你的程序也将如此,除非你做一些改变

这里有一种方法:

// Save a variable so you can invoke the EventHandler elsewhere
EventHandler navigationCompletedHandler = (sender, args) =>
{
    var s = MyMapView.MapScale;
    if (s < 500)
        MyMapView.SetViewpointScaleAsync(700);
    if (s > 16500000)
        MyMapView.SetViewpointScaleAsync(16500000);
};
MyMapView.NavigationCompleted += navigationCompletedHandler;

// Invoke the above handler one time when the map first loads
EventHandler firstViewpointChangeHandler = null;
firstViewpointChangeHandler = (sender, args) =>
{
    if (!double.IsNaN(MyMapView.MapScale))
    {
        MyMapView.ViewpointChanged -= firstViewpointChangeHandler;
        navigationCompletedHandler.Invoke(null, null);
    }
};
MyMapView.ViewpointChanged += firstViewpointChangeHandler;
//保存一个变量,以便在别处调用EventHandler
EventHandler navigationCompletedHandler=(发送方,参数)=>
{
var s=MyMapView.MapScale;
如果(s<500)
MyMapView.SetViewpointScaleAsync(700);
如果(s>16500000)
MyMapView.SetViewpointScaleAsync(16500000);
};
MyMapView.NavigationCompleted+=navigationCompletedHandler;
//在映射首次加载时调用上述处理程序一次
EventHandler firstViewpointChangeHandler=null;
firstViewpointChangeHandler=(发送方,参数)=>
{
如果(!double.IsNaN(MyMapView.MapScale))
{
MyMapView.ViewpointChanged-=firstViewpointChangeHandler;
navigationCompletedHandler.Invoke(null,null);
}
};
MyMapView.ViewpointChanged+=firstViewpointChangeHandler;

当您构建地图包/将其发布到一个服务时,您可以在ArcMap中将地图文件的缩放级别设置为您想要的任何时间间隔,ArcMap似乎尊重它(至少对我来说是这样)

地图比例下拉菜单->自定义此列表->标准比例->勾选“缩放时仅显示这些比例”框

省去了编写自定义mapscale事件处理程序的麻烦