2010-06-13 30 views
8

MouseLeftButtonDown olaylarını ancak ContactDown olaylarını tetiklemeyen Microsoft Surface SDK'yı kullanırken, bir WPF denetimindeki bir MouseLeftButtonDown olayını program aracılığıyla elle çalıştırmaya çalışıyorum. Temelde, bir ContactDown olayını ele alırken kontrolde doğru davranışı söndürmek için MouseLeftButtonDown olayını kontrole doğru itmeye çalışıyorum.Ateşleme MouseLeftButtonDown olayı programlı olarak

Sanırım bir şekilde kontrolde RaiseEvent yöntemini MouseButtonEventArgs ile yapmak zorundayım, ancak parametreleri bulmakta zorluk çekiyorum.

Yardımlarınız için şimdiden teşekkür ederiz!

cevap

5

Win32 interop kullanarak fare ve önemli olayları taklit edebilirsiniz. SendInput işlevini MSDN/pinvoke.net'da araştırın.

Bu durumun, sistemin ve diğer uygulamaların farenin gerçekten tıklanmış olduğunu düşünmesine neden olacağını unutmayın. Sadece bir WPF olayı başlatmak istiyorsanız, RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent))'u deneyin.

+0

Bahşiş için teşekkürler. Gönderdiğiniz RaiseEvent yöntemiyle bir istisna alıyorum: 'System.Windows.RoutedEventArgs' nesnesinin nesnesi 'System.Windows.Input.MouseButtonEventArgs' türüne dönüştürülemiyor. – RajenK

+0

deneyin 'RaiseEvent (yeni MouseButtonEventArgs (Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left)); ' – devios1

+1

ınvalidoperationexception bu biri ile oluşur: her RoutedEventArgs ile ilişkili olmayan bir boş RoutedEvent olmalıdır. – RajenK

2

Bir denetimde belirli bir olayı tetikleme isteği, genellikle koddaki bir tasarım sorununun göstergesidir. Olay işleyicileri tetikleme davranışı yapmalı, gerçekleştirmemelidir. MouseLeftButtonDown olay işleyicisi tarafından tetiklenen eylemi gerçekleştiren kodu ayrı bir yönteme taşımanızı öneririm. Daha sonra aynı yöntem ContactDown olay işleyicisinden çağrılabilir.

+0

Bunun en iyi çözüm olacağını kabul ediyorum, ancak bu özel kontrolün kaynak koduna erişimim olmadığı için (sadece ikili), korkarım ki işe yaramayacak. – RajenK

2
var grid = new Grid();    

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds; 
const MouseButton mouseButton = MouseButton.Left; 
var mouseDownEvent = 
    new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) { 
     RoutedEvent = UIElement.MouseLeftButtonDownEvent, 
     Source = grid, 
    }; 

Bu, olayı test kodumda bu şekilde nasıl tetiklerim.

İlgili konular