Увеличете поведението на PanningMode на ScrollViewer със събития на мишката

Опитвам се да се движа около съдържанието на ScrollViewer по същия начин, по който бихте се движили в PDF документ (превъртете, за да увеличите/намалите мащаба, щракнете + плъзнете, за да панорамирате) ScrollViewer има тази функционалност, вградена за събития с докосване (PanningMode) , но това изглежда не се превежда в събития с кликване и плъзгане. Има ли начин да му кажете да/емулира тази функционалност?


person Ben K.    schedule 27.02.2012    source източник


Отговори (1)


Панорамирането се активира вътрешно от четири виртуални метода, реализирани от ScrollViewer:

OnManipulationCompleted
OnManipulationDelta
OnManipulationInertiaStarting
and OnManipulationStarting

И така, къде са дефинирани тези виртуални методи. Да вървим нагоре в йерархията. Виждаме, че се извиква на UIElement в рамките на OnManipulationCompletedThunk (сигурен съм, че има съпътстващи методи и за останалите).

В този момент всичко все още е лично, искаме да използваме нещо. За съжаление това е моментът, в който и рефлекторът, и ILSpy ме провалиха (е всъщност не, сайтът за повикване е в различна dll (PresentationCore), която не съм заредил brb). Добре обратно. След като погледнем в PresentationCore, имаме неясна идея, че dependencyProperties са регистрирани статично, така че намираме .cctor. Тук има няколко интересни реда.

ManipulationCompletedEvent = Manipulation.ManipulationCompletedEvent.AddOwner(typeof(UIElement));

и

EventManager.RegisterClassHandler(typeof(UIElement), ManipulationCompletedEvent, new EventHandler(UIElement.OnManipulationCompletedThunk));

Виждаме, че OnManipulationCompletedThunk е регистрираното обратно извикване за този манипулатор на клас, който слуша за ManipulationCompletedEvent. Освен това ManipulationCompletedEvent не е първоначално дефиниран в UIElement, той е заимстван от статичния клас Manipulation чрез AddOwner.

Извършвайки търсене на класа Manipulation, виждам, че той е в пространството от имена System.Windows.Input в рамките на същия сбор. Публично ли е, да. Готино! така че в този момент знам, че ако задействам ManipulationCompletedEvent или някой от неговите приятели, той в крайна сметка ще извика ScrollViewer. http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

В документацията за този публичен статичен клас виждам, че има куп интересни и вероятно полезни методи. Единственият, който не е очевиден, е AddManipulator. Какво прави това нещо? Щраквания... чете... о, "Всяка точка на докосване е обект на IManipulator. Например, ако използвате два пръста, за да преоразмерите обект, TouchDevice, което имплементира IManipulator, се създава за всеки пръст." Така че TouchDevice е IManipulator. Може би това ще ми даде някаква идея как да създам свой собствен манипулатор.

Свойствата на TouchDevice дават известна представа за функциите, които поддържа. Това е нещо като MouseDevice (има концепцията за улавяне, DirectlyOver и т.н.), но не поддържа манипулиране по същия начин. По-скоро искаме да направим манипулация в отговор на събития с мишката. Нека разгледаме по-внимателно TouchDevice, за да видим как наистина прилага някои от тези функции.

Методите, които TouchDevice прилага, са GetPosition и ManipultionEnded

GetPosition връща this.GetTouchPoint(relativeTo).Position; relativeTo е параметър

ManipulationEnded извиква OnManipulationEnded, препращайки bool параметър с име cancel. Още не съм сигурен какво прави cancel. о, оказа се, че не е използвано, странно, но добре. Това основно настройва улавянето на нула. Kindof в края на заешката дупка тук, така че ще трябва да направим резервно копие и да преоценим.

Всичко, което наистина искам да направя, е да повдигна събития ръчно на UIElement и да видя дали работи. Методът RaiseEvent на UIElement трябва да работи за това. ще пробвам brb. Грешка, изчакайте, пропуснах нещо, всички събития, дефинирани в класа Manipulation, са маркирани като вътрешни.

Ясно е, че тези събития са предназначени само за вътрешно потребление и освен да правим размисъл, нямаме път там.

Мисля, че може би използването на функцията за манипулиране е прекалено много за това, което се опитвате да направите. Вероятно има начин да се приложи това само с drag събитие и платно.

Освен това намерих това, докато гугълнах и си помислих, че може да е от значение http://multitouchvista.codeplex.com/

person user1834059    schedule 21.11.2012