mvvm дружественный подход к жестам панорамирования / масштабирования - PullRequest
2 голосов
/ 17 февраля 2011

Мое приложение выполняется в соответствии со стандартным примером карты Bing, где я по сути размещаю объекты в определенных точках x, y на холсте и отрисовываю их.Вместо карты Bing, выступающей в качестве фона на холсте, у меня фактически есть куча директив line / path для рисования базового контента, и нужно, чтобы размещенные объекты «прилипали» к этому базовому контенту, когда пользователь панорамирует / увеличивает.Я использую фреймворк mvvm (в частности, MVVM light) и хочу, чтобы окончательное решение было дружественным к mvvm, но сейчас мне нужно решить проблему, связанную с тем, что мои объекты не придерживаются базовой «карты», когда пользователь выполняет панорамирование / перевод.*

Мой основной вид выглядит следующим образом:

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

, и у меня есть различные шаблоны данных, определенные для различных типов LocationViewModels (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, привязанные к холсту, не перемещаются с помощью жестов пользователя.Нужно ли каким-то образом подключать событие манипуляции для обновления относительного (x, y) каждого из элементов в ItemsControl?

1 Ответ

0 голосов
/ 09 марта 2011

Попробуйте что-то вроде:

<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 и конвертер для расчета масштабирования.Нашел преобразователь масштабирования здесь , но в итоге использовал логику масштабирования из здесь .

...