Масштабирование и панорамирование в GMap.net
-
14-11-2019 - |
Вопрос
Я пытаюсь сделать GMap.Net управление мультитач включено, используя встроенные события WPF, но мне это не удалось.
Нашёл серию статей про мультитач вроде этот и этот один.Во всех из них ManipulationContainer
представляет собой холст и размещенные на нем подвижные элементы управления, но в проблеме GMap ManipulationContainer
является GMapControl
и контроля над этим нет.как я могу использовать e.ManipulationDelta
данные для масштабирования и перемещения?
А GMapControl
имеет Zoom
свойство, увеличивая или уменьшая его, можно увеличивать или уменьшать масштаб.
Решение
Беглый взгляд на код показывает, что GMapControl
является ItemsContainer
.
Вы должны иметь возможность изменить стиль ItemsPanel
шаблон и предоставьте IsManipulationEnabled
недвижимость там:
<g:GMapControl x:Name="Map" ...>
<g:GMapControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsManipulationEnabled="True" />
</ItemsPanelTemplate>
</g:GMapControl.ItemsPanel>
<!-- ... -->
На этом этапе вам необходимо подключить Window
:
<Window ...
ManipulationStarting="Window_ManipulationStarting"
ManipulationDelta="Window_ManipulationDelta"
ManipulationInertiaStarting="Window_InertiaStarting">
И предоставьте соответствующие методы в Code Behind (бессовестно украденном и адаптированном из этого Пошаговое руководство MSDN):
void Window_ManipulationStarting(
object sender, ManipulationStartingEventArgs e)
{
e.ManipulationContainer = this;
e.Handled = true;
}
void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
// uses the scaling value to supply the Zoom amount
this.Map.Zoom = e.DeltaManipulation.Scale.X;
e.Handled = true;
}
void Window_InertiaStarting(
object sender, ManipulationInertiaStartingEventArgs e)
{
// Decrease the velocity of the Rectangle's resizing by
// 0.1 inches per second every second.
// (0.1 inches * 96 pixels per inch / (1000ms^2)
e.ExpansionBehavior.DesiredDeceleration = 0.1 * 96 / (1000.0 * 1000.0);
e.Handled = true;
}