using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; //DispatcherPriority, timer namespace moveButton { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } // interwał timera w ms private const int TIMER_INTERVAL = 100; // tworzymy timer private System.Windows.Threading.DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(TIMER_INTERVAL) }; // współrzędna x przycisku na początku private int x = 10; // flaga stanu przycisku określająca czy przycisk się porusza czy nie private bool isMoving = false; // po kliknięciu przycisk zaczyna sie poruszać w prawo // po powtórnym kliknieciu przycisk zatrzymuje się private void Button_Click(object sender, RoutedEventArgs e) { // jeśli przycisk się porusza if (isMoving) { // zmieniamy flagę isMoving = false; // stopujemy timer timer.Stop(); // zmieniamy napis na przycisku btnMove.Content = "I'm stopped!"; } // jeśli przycisk się nie porusza else { // startujemy timer timer.Start(); // zmieniamy napis na przycisku btnMove.Content = "I'm moving!"; // pobieramy marginesy przycisku Thickness margin = btnMove.Margin; // kod trigerowany przez timer co TIMER_INTERVAL ms timer.Tick += (sender, args) => { // ustawiamy lewy margines przycisku na wpółrzędną x margin.Left = x; btnMove.Margin = margin; // inkrementacja wpółrzędnej x przycisku x++; // zabezpieczenie żeby wprzycisk nie uciekł z okna if (x == Form1.Width) { x = 0; } }; // zmieniamy flagę przycisku isMoving = true; } } } }