之前我们提到过MVVM意在将UI与逻辑彻底分离,最理想的情况下我们在UI.cs文件后面不写一句代码,在VM里面不写一句逻辑。
最近用ArcGIS Runtime的时候,出现了这样一个问题:
<esri:SceneView x:Name="mySceneView"
ElevationExaggeration="{Binding ElementName=SliderValue,Path=Value}"
>
<esri:Scene>
<esri:Scene.Surface>
<esri:ServiceElevationSource IsEnabled="True"
ServiceUri="http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"/>
</esri:Scene.Surface>
<layers:ArcGISTiledMapServiceLayer ID="Imagery" x:Name="GisTiledMapServiceLayer"
ServiceUri="http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer"/>
<layers:SceneLayer ID="Buildings"
ServiceUri="http://scene.arcgis.com/arcgis/rest/services/Hosted/Building_Vancouver/SceneServer/Layers/0" IsVisible="True"/>
</esri:Scene>
</esri:SceneView>
我想为mySceneView这个View设置自定义导航,但是它的方法是这样的
mySceneView.SetView(new Camera(new MapPoint(-123.114867093837,
49.2638368778531, 340.3367222948), 7.374728906848, 69.8626679976746));
但我希望我的.cs文件更加单纯,在C罗Boss的建议下(感谢C罗提供知识赞助),所以我这样处理了
<Button Content="fly" HorizontalAlignment="Left" Margin="50,50,0,0" VerticalAlignment="Top"
Command="{BindingSetNavigationCommand,UpdateSourceTrigger=Default,Mode=TwoWay}"
CommandParameter="{Binding ElementName=mySceneView}"
>
就是说我直接将这个叫mySceneView对象传过去了,然后在VM里面进行逻辑调用,当然这是由于ArcGIS在设计它的框架就已经考虑了这个非UI线程操纵的问题
public ICommand SetNavigationCommand
{
get
{
return new DelegateCommand<SceneView>((mySceneView) =>
{
foreach (var x in serviceAgent.GetLines())
{
mySceneView.SetViewAsync(x,0.3,false);
}
});
}
}
好,目的达成~