2015-08-24 5 views
1

Когда пользователь вручную перемещает карту, я хотел бы оценить некоторые критерии и, возможно, сделать что-то, когда они будут закончены. Кажется, я не могу найти подходящее MapControl event для этого.Windows 10 UWP MapControl переместил событие

Я пробовал использовать CenterChanged, но он постоянно срабатывает, когда карта движется и ухудшает производительность.

Какое MapControl событие можно использовать, когда пользователь закончил перемещение карты?

+1

Возможно, вы используете событие ManipulationCompleted. В противном случае типичным подходом было бы остановить и перезапустить таймер в обработчике CenterChanged и выполнить окончательную обработку в обработчике Tick. – Clemens

+0

Спасибо за комментарий. Я пытался использовать ManipulationCompleted ранее, но событие никогда не срабатывает. У вас есть пример подхода таймера? – joshb

+0

Вам нужно установить ManipulationMode на значение, отличное от None или System, например. все. См. [Здесь] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationcompleted.aspx). – Clemens

ответ

3

Я закончил использовать таймер, чтобы проверить центр карты каждую секунду и соответствующим образом обновить мою модель. Мне кажется, что это взломать, но это гораздо более результативно, чем использование CenterChanged. DispatchTimer используется, чтобы позволить таймеру запускать поток пользовательского интерфейса, чтобы он имел доступ к MapControl.

DispatcherTimer mapCenterTimer = new DispatcherTimer(); 
mapCenterTimer.Tick += (object sender, object e) => 
{ 
    ViewModel.MapCenter = MyMapControl.Center; 
}; 
mapCenterTimer.Interval = new TimeSpan(0, 0, 1); // fire every second 
mapCenterTimer.Start(); 

Он уверен, было бы хорошо, если MapControl подвергается какой-то ManualMoveComplete событие для тех из нас, кто хочет принять меры, когда пользователь закончил перемещать карту. Я создал запрос для этого здесь по адресу uservoice: https://binglistens.uservoice.com/forums/283355-ideas/suggestions/9494889-add-a-centermanuallychanged-event-to-mapcontrol

0

Как я бы согласился с вами, что я предпочел бы какое-то замедленное событие, я также предпочитаю подробные средства управления и, скорее, фильтровать события самостоятельно. Из вашего решения вместо того, чтобы каждую секунду запускать периодический таймер, просто перезапустите его при срабатывании события. Когда событие прекращает стрельбу, таймер будет тикать, и вы получите окончательное значение:

DispatcherTimer mapCenterTimer = new DispatcherTimer(); 
mapCenterTimer.Tick += (object sender, object e) => 
{ 
    mapCenterTimer.Stop(); 
    ViewModel.MapCenter = MyMapControl.Center; 
}; 
mapCenterTimer.Interval = TimeSpan.FromMilliseconds(500); // map idle for .5 seconds 
MyMapControl.CenterChanged += (map, args) => { mapCenterTimer.Stop(); mapCenterTimer.Start(); }; 
2

Я знаю, что я около года слишком поздно об этом, но в случае, если кто работает в этот вопрос ... Я уверен, что правильный способ сделать это - послушать событие LoadingStatusChanged, а затем принять меры, когда вы вернетесь MapLoadingStatus.Loaded.

public void LoadingStatusChangedEventHandler(MapControl sender, Object o) 
{ 
    if (sender.LoadingStatus == MapLoadingStatus.Loaded) 
    { 
     // The map has stopped moving and finished rendering 
     DoSomething(); 
    } 
} 

Я знаю, что документация для этого события не велика, но есть немного больше информации на this code sample, и вы можете быть в состоянии найти даже больше на git repo.

+0

Это лучшее решение. Именно то, что мне нужно. Спасибо, что поделился. – FIL

Смежные вопросы