2012-02-27 15 views
8

Bir ScrollViewer'ın içeriğini, bir PDF belgesinde gezinirken yaptığınız gibi kaydırmaya çalışıyorum (yakınlaştır/uzaklaştırmak için kaydır, kaydırmak için + sürükle) ScrollViewer Touch olayı (PanningMode) için bu işlevselliğe sahiptir, ancak bu Click + Drag olaylarına çevrilmiş gibi görünmemektedir. Bu işlevselliğe/işlevine söylemek için bir yolu var mı?ScrollViewer'ın fare olaylarıyla Gauge PanningMode davranışı

cevap

2

Kaydırma ScrollViewer tarafından uygulanan dört sanal yöntemlerle dahili olarak etkindir:

OnManipulationDelta OnManipulationInertiaStarting ve OnManipulationStarting

Peki tanımlanan bu sanal yöntemlerdir OnManipulationCompleted. Hiyerarşiye gidelim. OnManipulationCompletedThunk içinde UIElement'e çağrıldığını görüyoruz (eminim ki geri kalanlar için eşzamanlı yöntemler de vardır).

Bu noktada her şey hala özel, bir şeylerin girmesini istiyoruz. Ne yazık ki bu, hem reflektörün hem de ILSpy'nin beni başarısızlığa uğrattığı noktadır (aslında işe yaramadı, çağrı sitesi farklı bir dll'de (PresentationCore), brb yüklü değil). Tamam, geri. PresentationCore'a baktığımızda, bağımlılıkProperties'in statik olarak kayıtlı olduğunu belirsiz bir fikre sahibiz, bu yüzden .cctor'u buluruz. Burada birkaç ilgi alanı var.

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

ve

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

OnManipulationCompletedThunk, ManipulationCompletedEvent dinleyen bu sınıf işleyicisi için kayıtlı geri arama olduğunu görüyoruz. Ayrıca, ManipulationCompletedEvent başlangıçta UIElement üzerinde tanımlanmamıştır, Manipülasyon statik sınıfından AddOwner ile ödünç alınmıştır.

Manipulation sınıfı için bir arama yapmak, aynı derleme içinde System.Windows.Input ad alanında olduğunu görüyorum. Halka açık mı, evet. Güzel! Bu noktada, ManipulationCompletedEvent'i veya arkadaşlarından birini ateşlediğimde, sonunda ScrollViewer'a çağrı yapacağımı biliyorum. Bu genel statik sınıfın belgelerinde, bir sürü ilginç ve olası yararlı yöntem olduğunu görüyorum. Kolayca anlaşılmayan tek şey AddManipulator'dur. Bu şey ne yapar? Tıklamalar .. okur .. oh, "Her temas noktası bir IManipulator nesnesidir. Örneğin, bir nesneyi yeniden boyutlandırmak için iki parmağınız varsa, her parmak için IManipulator'u uygulayan bir TouchDevice oluşturulur." Yani TouchDevice bir IManipulator. Belki bu bana kendi manipülatörümü nasıl oluşturacağına dair bir fikir verecektir.

TouchDevice'deki Özellikler, desteklediği özellikler hakkında bazı ipuçları verir. Bir çeşit MouseDevice gibi (yakalama, DirectlyOver vb. Kavramları var), ama manipülasyonu aynı şekilde desteklemiyor. Daha ziyade, Fare olaylarına yanıt olarak Manipülasyon yapmak istiyoruz. Bu özelliklerin bazılarını gerçekten nasıl uyguladığını görmek için TouchDevice'e daha fazla bakalım.

yöntem TouchDevice uygulamaktadır GetPosition ve GetPosition this.GetTouchPoint (relativeTo) döndürür

ManipultionEnded.pozisyonu; relativeTo,

parametresidir. ManipülasyonEndirilen çağrılar OnManipulationEtkili adında bir bool parametresi gönderilir. Henüz iptalin ne olduğundan emin değil. oh, kullanılmış değil, garip ama tamam. Bu temelde yakalamayı null olarak ayarlar. Buradaki tavşan deliğinin sonunda, geri dönüp tekrar değerlendirmemiz gerekecek.

Tek yapmam gereken şey UIElement üzerinde olayları manuel olarak yükseltmek ve çalışıp çalışmadığını görmek. UIElement üzerindeki RaiseEvent yöntemi bunun için çalışmalıdır. brb denemek için gidiyor. Err bekle bir şey özledim, Manipulation sınıfında tanımlanan tüm olaylar dahili olarak işaretlendi.

Açıkça, bu olaylar sadece iç tüketim için kastedilmektedir, ve yansıma yapmanın kısa bir yolu burada bir avantaja sahip değildir.

Belki de Manipulation özelliğini kullanmanız, yapmaya çalıştığınız şey için çok fazla olduğunu düşünüyorum. Bunu sadece sürükleme olayı ve bir tuval ile gerçekleştirmenin bir yolu vardır.

Ayrıca, bunu googling yaparken buldum ve onunla alakalı olabileceğini düşündüm http://multitouchvista.codeplex.com/