Dienstag, 10. Mai 2011

Wo ist "Long Left Button Down" im XAML?

Gerade bei Touch-Screen oder Windows Phone 7 Anwendungen wäre heute ein "Long Left Button Down Event" für beispielsweise Kontextmenüs ganz nützlich gewesen. Die folgenden Zeilen zeigen eine Lösungsweg mit dem Reactive Framework.
 
public event MouseButtonEventHandler MouseLeftButtonLongDown;
public Ctor()
{
    InitializeComponent();           
    var cancelEvent = Observable
     .FromEvent<MouseButtonEventArgs>(this, "MouseLeftButtonUp");
   
    var timer = Observable
     .Timer(TimeSpan.FromSeconds(1))
     .ObserveOnDispatcher();
   
    Observable
     .FromEvent<MouseButtonEventArgs>(this, "MouseLeftButtonDown")
     .Subscribe(x=> timer
      .TakeUntil(cancelEvent)
      .Subscribe(e => MouseLeftButtonLongDown(x.Sender, x.EventArgs)));

    MouseLeftButtonLongDown += (s,e) => MessageBox.Show("Test");
}
 

Für “this” kann natürlich jedes andere von UIELement abgeleitete XAML Element eingesetzt werden. Das Klick-Timeout liegt im Beispiel bei 1 Sekunde.