2011-06-22 10 views
8

Jak powtarzalnie wykonywać czynność, gdy lewy przycisk myszy jest naciśnięty i przytrzymany w WPF?WPF: Lewy przycisk myszy kliknij i przytrzymaj manipulowanie

następującą procedurę obsługi zdarzenia dla zdarzenia UIElement.PreviewMouseLeftButtonDown nie otrzymać pracę:

private void BaseButtonRight_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      // keep performing action while mouse left button is pressed. 
      // Checking e.ButtonState works only for one click 

     } 

Wykonanie nawet nie dostać się do pętli while i obsługi jest wywoływana, gdy lewy przycisk myszy jest zwolniony!

Odpowiedz

17

Dlaczego nie wykorzystać do RepeatButton?

http://msdn.microsoft.com/en-us/library/ms746649(v=vs.85).aspx

+1

To powinna być zaakceptowana odpowiedź. – GONeale

+0

@GONeale, chyba że OP nie używa przycisku ... Mam ten sam problem i nie klikam przycisku, więc ta odpowiedź mi nie pomoże. Będę używał odpowiedzi w tle wątku. Ale tak, OP powinien wybrać odpowiedź lub opublikować własną odpowiedź i wybrać tę. – CramerTV

+0

Chłopcze, zapomnij kontekst, pod którym zadane pytanie, ale zaakceptuj tę odpowiedź. –

0

Uruchamiaj wątek, aż uruchomi się MouseLeftButtonUp.

+0

muszę manipulować z UI. Zobacz komentarze poniżej. –

1

Uruchom BackroundWorker, który kończy działanie po zwolnieniu myszy. Ustaw flagę za pomocą zdarzenia "mouse up", a także sprawdzaj okresowo w funkcji DoWork do pracy w tle. Upewnij się, że używasz blokady {} wokół dostępu do flagi.

Edit: w przypadku, gdy chcesz uzyskać dostęp coś na wątków UI, użyj Dispatcher.BeginInvoke, na przykład:

Dispatcher.BeginInvoke(new ThreadStart(delegate 
{ 
    ComboBoxItem selItem = ComboboxConnectString.SelectedItem as ComboBoxItem; 
    if (selItem != null && selItem.Tag is string) 
     ComboboxConnectString.Text = (string)selItem.Tag; 
})); 
+0

Praca, którą należy wykonać, polega na manipulowaniu za pomocą elementu RenderTransform elementu interfejsu użytkownika. Korzystanie z BackgroundWorker szuka wyzwanie. BackgroundWorker.DoWork zasadniczo będzie spać, ale jeśli mam wątek do wątku UI, w jaki sposób wywołać ponownie BackgroundWorker.DoWork? –

+0

Gdy chcesz wywołać ponownie do wątku interfejsu użytkownika, aby zmodyfikować RenderTransform, zrób to za pomocą Dispatcher.BeginInvoke (edytowałem mój post, aby dołączyć próbkę). Modyfikacja zostanie następnie wykonana w wątku UI, podczas gdy będziesz kontynuował pętlę. Jest to ta sama metoda, którą wszyscy używają do wykonania akcji w tle podczas aktualizowania paska postępu. –

Powiązane problemy