2011-02-16 58 views
2

我的應用程序是沿着一個標準的兵圖示例,在那裏我基本上配售對象在規定的X,在畫布Y座標和渲染他們的線。作爲我的畫布上的Bing背景,我實際上有一堆線/路徑指令來繪製底層內容,並且需要放置的對象在用戶平移/縮放時「粘」到該底層內容。我使用MVVM框架(特別是MVVM光),並希望最終的解決方案是MVVM友好的,但現在需要解決的我不物體粘在底層的「地圖」,當用戶平移/翻譯的問題。MVVM友好的方式來平移/縮放手勢

我的主視圖是這樣的:在適當的所需X的各類LocationViewModels(RestaurantViewModel,ParkingGarageViewModel,等..)來呈現每個位置的定義

<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> 

和我有不同的數據模板,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)?

回答

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綁定綁定到地圖縮放級別和一個轉換器來計算縮放。找到縮放轉換器here,但最終使用了從here的縮放邏輯。