3

Как в WPF реализовать отскок от границ экрана? (Экран потом что wpf разворачивается на весь экран) В WinForm получилось так:

if (picEnot.Left <= Ground.Left)
{
    speedLeft = -speedLeft;
} 

и тд с каждой стороной.

Ground - это панель, speed - скорость перемещения, picEnot - перемещаемая картинка по таймеру.

В WPF удалось реализовать движение по таймеру через margin. Но как ограничить экран я не понимаю.

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
Viewed
  • 1,408
  • А почему Margin? Почему вы не пользуетесь Canvas в качестве контейнера? И почему нельзя точно так же проверить координаты? – VladD Feb 04 '16 at 12:14
  • Потому что я смотрю на WPF не больше суток и не понимаю эти контролы – Viewed Feb 04 '16 at 13:33
  • Ну так прочитайте какую-нибудь книгу. [Представьте себе водителя грузовика, который на полной скорости начинает спрашивать, как переключать передачу.] – VladD Feb 04 '16 at 13:44

1 Answers1

3

Делайте так:

  1. В качестве контейнера используйте Canvas.
  2. Положение на Canvas'е устанавливайте при помощи Canvas.Left и Canvas.Top (выясните, как устанавливать значение attached property).
  3. Выход за границу слева и сверху проверяется очевидным образом.
  4. Для проверки выхода за границу справа и снизу вам нужно точно знать ширину и высоту вашего объекта (в крайнем случае покатит свойство ActualWidth/ActualHeight). Прибавьте к координате левой стороны объекта его ширину, получите правую. Сравните её с правой координатой контейнера (которую можно вычислить точно так же).
VladD
  • 206,799
  • Что проверяется очевидным образом, это понятно. Только я не понимаю, как это написать кодом.

    На WinForm получилось более, чем быстро. Но из-за специфики "графики" нужен wpf.

    – Viewed Feb 04 '16 at 17:41
  • @Viewed: Ну, вы ведь сами присваиваете новое значение Canvas.Left? Вот и проверьте перед присвоением, чтобы оно не было меньше нуля. – VladD Feb 04 '16 at 17:56
  • Что-то наметилось...

    Уверен, что можно упростить. Не посмотрите?

    – Viewed Feb 04 '16 at 18:12
  • @Viewed: Показывайте! – VladD Feb 04 '16 at 18:18
  • скриншот

    Не нули, так как при них небольшая часть изображения зрительно уходит за предел экрана. Изначально скорость 100, так как это начальное местоположения картинки

    – Viewed Feb 04 '16 at 18:25
  • @Viewed: Переменная speedTop означает по сути PositionY? – VladD Feb 04 '16 at 18:27
  • X или Y это я уже совсем запутался. Но да speed это то или иное положение. – Viewed Feb 04 '16 at 18:28
  • @Viewed: Вы могли бы вместо Canvas.GetLeft(Enot) использовать speedLeft, они ж равны по идее. – VladD Feb 04 '16 at 18:28
  • Но как это повлияет на картинку? – Viewed Feb 04 '16 at 18:29
  • @Viewed: А ещё, почему вы сравниваете с SystemParameters.PrimaryScreenWidth? Вы должны по идее сравнивать с шириной Canvas, разве нет? – VladD Feb 04 '16 at 18:30
  • @Viewed: На картинку — никак. – VladD Feb 04 '16 at 18:30
  • Во первых, потому что все происходит "на весь экран". Во вторых, потому что с шириной Canvas у меня ничего не получилось – Viewed Feb 04 '16 at 18:31
  • Почему не получилось? Вы пользовались, я надеюсь, canvas.ActualWidth? – VladD Feb 04 '16 at 18:34
  • Не-а) PrimaryScreen тоже подходит

    Никаких предложений по упрощению?

    – Viewed Feb 04 '16 at 18:53
  • @Viewed: Вроде проще некуда. – VladD Feb 04 '16 at 18:55
  • @Viewed: Кстати, PrimaryScreen подходит только если у юзера всего один монитор. Или несколько мониторов с одинаковым разрешением. Так что... – VladD Feb 04 '16 at 18:56
  • Больше и не надо. Но картинка будет не одна, поэтому попробую все это сделать более универсальным – Viewed Feb 04 '16 at 19:01