WPF zmiana położenia elementu względem poprzedniej pozycji

0

Cześć,

czy znacie może jakiś sposób na przypisanie nowego położenia elementu po jakiejś konkretnej akcji?

Tj. załóżmy, że mam Rectangle o nazwie Windajo i chcę aby po wciśnięciu jakiegoś buttona zmienił on swoje położenie Y o załóżmy 10 jednostek względem poprzedniej pozycji.

Nie mam kompletnie pojęcia skąd zdobyć wartość aktualnej pozycji, a jedyna funkcja zmieniająca położenie do której się dokopałem to Margin. Dużo osób pisze również o Canvas, ale kompletnie nie rozumiem jej działania.

Udało mi się uzyskać zmianę położenia z użyciem Margin jednak jest to (chyba) położenie względem granicy okna, a nie poprzedniego położenia i operowanie na tym jest dosyć uciążliwe.

 
private async void button_Click(object sender, RoutedEventArgs e)
        {
	int i = 300;

                do
                {
                    Windajo.Margin = new Thickness(85, i, 80, 0);
                    await Task.Delay(500);
                    i = i - 20;
                } while (i > 100);

        }

Ewentualnie czy da się uzyskać jedną wartość z tego położenia i zapisać ja do jakiejś zmiennej? Powiedzmy np. to 85 po new Thickness (85, i, 80, 0).

Z góry dziękuje za pomoc.

0

Margin to jest generalnie margines między danym elementem a jego otoczeniem. Jeśli położysz koło siebie kilka przycisków, to tą właściwością możesz zrobić między nimi odstępy. Położenie konkretnie względem granicy okna można ustawić tą właściwością jedynie dla tego, co jest bezpośrednio wewnątrz Window.

W kodzie C# da się wyciągnąć pojedyncze wartości marginesów z wybranej strony przez np. Windajo.Margin.Left (albo zamiast Left inna strona), ale to nie jest najlepszy pomysł, żeby akurat tego Margin używać w tym przypadku, bo to niekoniecznie świadczy o położeniu prostokąta.

Canvas to jest panel, w którym można umieścić jakiś element i podać współrzędne położenia tego elementu, przy czym to są współrzędne nie względem okna, tylko tego panelu. Możesz więc zamiast prostokąta wstawić Canvas, a prostokąt do jego wnętrza z określonymi współrzędnymi i zmieniać je po naciśnięciu przycisku:

        <Canvas Width="100" Height="50">
            <Rectangle Name="rect" Canvas.Left="0" Canvas.Top="0" Width="100" Height="50" Fill="Green" />
        </Canvas>

a w C#:

            double left = Canvas.GetLeft(rect);
            Canvas.SetLeft(rect, left + 10);

Zwróć uwagę, że tam jest Canvas.Get/SetLeft, a nie rect.Left.

1 użytkowników online, w tym zalogowanych: 0, gości: 1