mvvm友好的平移/缩放手势方法

时间:2011-02-16 21:07:52

标签: wpf windows-7 mvvm .net-4.0 mvvm-light

我的应用程序遵循标准的Bing地图示例,我实际上是将对象放置在画布中定义的x,y位置并渲染它们。我没有在我的画布上充当背景的Bing地图,而是实际上有一堆线/路径指令来绘制底层内容,并且需要放置的对象在用户平移/缩放时“粘贴”到这个底层内容。我正在使用mvvm框架(特别是MVVM光),并希望最终的解决方案是mvvm友好的,但是现在需要解决我的对象在用户平移/翻译时不坚持底层“地图”的问题。 p>

我的主要观点如下:

<Canvas Margin="10" Background="AliceBlue" IsManipulationEnabled="True" ManipulationStarting="manipulatingStarting" ManipulationDelta="manipulationDelta">
    <view:MapView x:Name="viewContent">
        <view:MapView.RenderTransform>
            <MatrixTransform/>
        </vw:MapView.RenderTransform>
    </view:MapView>
    <ItemsControl ItemsSource="{Binding Locations}"/>
</Canvas>

我已经为各种类型的LocationViewModel(RestaurantViewModel,ParkingGarageViewModel等)定义了各种数据模板,以便使用他们的视图在所需的x,y位置适当地渲染每个位置。

现在,我主视图中的代码如下所示:

    private void manipulatingStarting(object sender, System.Windows.Input.ManipulationStartingEventArgs e)
{
    // just let the user pan/translate for now
    e.Mode = System.Windows.Input.ManipulationModes.Translate;
}

private void manipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
{
    MatrixTransform transform = viewContent.RenderTransform as MatrixTransform;
    if (transform != null)
    {
       Matrix matrix = transform.Matrix;
       matrix.Translate(e.DeltaManipulation.Translation.X,     e.DeltaManipulation.Translation.Y);
       transform.Matrix = matrix;
       e.Handled = true;
    }
}

这允许用户平移/翻译MapView内容,但绑定到画布的ItemsControl中的对象不会随用户的手势移动。我是否需要以某种方式挂钩操作事件以更新ItemsControl中每个项的相对(x,y)?

1 个答案:

答案 0 :(得分:0)

尝试类似:

<map:Map CredentialsProvider="xyz"
     NavigationVisibility="Collapsed">
<map:MapLayer>
    <map:MapItemsControl ItemTemplate="{StaticResource MyTemplate1}"
                         ItemsSource="{Binding Shops}" />
</map:MapLayer>
<map:MapLayer>
    <map:MapItemsControl ItemTemplate="{StaticResource MyTemplate2}"
                         ItemsSource="{Binding Theaters}" />
</map:MapLayer>

一个模板:

<DataTemplate x:Key="MyTemplate1">
<Grid map:MapLayer.Position="{Binding Location}"
      map:MapLayer.PositionOrigin="Center"
      RenderTransformOrigin="0.5,0.5">
    <rb:BindingHelper.Binding>
        <rb:RelativeSourceBinding Path="ZoomLevel"
                                  TargetProperty="RenderTransform"
                                  RelativeMode="FindAncestor"
                                  AncestorType="Microsoft.Maps.MapControl.Map"
                                  Converter="{StaticResource PushpinScaleTransform}" />
    </rb:BindingHelper.Binding>
    <Image Source="MyImage.png" />

然后在我的模板中,我使用RelativeSource绑定绑定到地图ZoomLevel和转换器来计算缩放。找到了缩放转换器here,但最终使用here中的缩放逻辑。