|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Здравствуйте, я недавно начал изучать WPF и столкнулся с проблемой. Я пытался привязать(забиндить) координаты элемента, который находится в Canvas: Код: xml 1. 2. 3.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Однако это не возымело никакого эффекта. При этом, если менять свойства Canvas.Top и Canvas.Left вручную, то квадрат меняет своё расположение в редакторе. Я пробовал ставить Mode TwoWay и даже использовать интерфейс INotifyPropertyChanged, который применяется в патерне MVVM, но ничего из этого не помогло. У меня складывается такое ощущения, что если это заработает-свершится настоящее чудо. Скажите, пожалуйста, что я делаю не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 19:28 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Canvas.Left="{Binding X, Mode=OneWay}" Canvas.Top="{Binding Y, Mode=OneWay}" неправильный Binding, Вы делайте связывание с контекстом, а не с окном. В контексте нет полей X и Y Они есть в классе окна. Либо используйте ElementName связывание и задайте имя окну, либо используйте RelativeSource связывание ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 19:47 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5.
вот рабочий вариант вашего примера ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 19:50 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Спасибо за быстрый ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 20:28 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Хотя нет, знаете что? Спасибо вам ОГРОМНОЕ. На других сайтах люди даже особо не смотрели на мой код и отмахивались этим шаблонным: нужен интерфейс INotifyPropertyChanged и тому подобное. А вы действительно мне помогли. Буду почаще заходить на этот сайт) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 20:54 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
111DarkFox111Хотя нет, знаете что? Спасибо вам ОГРОМНОЕ. На других сайтах люди даже особо не смотрели на мой код и отмахивались этим шаблонным: нужен интерфейс INotifyPropertyChanged и тому подобное. А вы действительно мне помогли. Буду почаще заходить на этот сайт)Вы задали вопрос http://www.cyberforum.ru/wpf-silverlight/thread2345072.html#post13027693 И я Вам там ответил. В том числе дал полностью рабочий пример кода. Интерфейс INotifyPropertyChanged для свойств предназначенных для привязывания обязателен. Вот тот пример кода Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 00:31 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Roman Mejtes Код: xml 1. 2. 3. 4. 5.
вот рабочий вариант вашего примера Roman Mejtes проясните, пожалуйста. А то я чего-то недопонял. Биндинги Вы исправили. Но в самом окне эти свойства реализованы без INotifyPropertyChanged. Установка значений идёт уже после инициализации элементов окна. А каким образом тогда элемент узнаЁт об изменении значения свойства? Или интерфейс INotifyPropertyChanged не всегда нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 00:41 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
А он и не узнаёт. Роман исправил только привязку. А если хочешь, чтобы изменение свойства отслеживалось - делай нотификацию. Но тут может проще даже сделать DependencyProperty - нет смысла добавлять к DependencyObject (коим является Window) еще и INotifyPropertyChanged ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 01:03 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Eld HaspУстановка значений идёт уже после инициализации элементов окна.Не скажу со 100% уверенностью, но вроде бы привязки будут обработаны уже после отработки конструктора, поэтому начальная значения привязка все равно увидит. В любом случае, считывание свойств привязкой идет в потоке пользовательского интерфейса, даже если я меняю их (и издаю нотификацию) в другом потоке. Так что, думаю, что вышесказанное сработает (проверять лень )) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 01:06 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Shocker.ProEld HaspУстановка значений идёт уже после инициализации элементов окна.Не скажу со 100% уверенностью, но вроде бы привязки будут обработаны уже после отработки конструктора, поэтому начальная значения привязка все равно увидит. В любом случае, считывание свойств привязкой идет в потоке пользовательского интерфейса, даже если я меняю их (и издаю нотификацию) в другом потоке. Так что, думаю, что вышесказанное сработает (проверять лень )) Результаты экспериментов. Если устанавливать привязку через ElementName, то инициализацию свойства надо проводить, до InitializeComponent();. Если позже - без INPC - значения не изменяются. Если устанавливать через DataContext (как в моём примере), то значения можно установить в любом месте конструктора окна. Если позже (допустим в Loaded) - то тоже без INPC изменения не замечаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 01:46 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Eld HaspВы задали вопрос http://www.cyberforum.ru/wpf-silverlight/thread2345072.html#post13027693 И я Вам там ответил. В том числе дал полностью рабочий пример кода. Интерфейс INotifyPropertyChanged для свойств предназначенных для привязывания обязателен. Вот тот пример кода Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Да, теперь я вижу, что ваш вариант тоже работает и даже лучше. Простите мне мою невнимательность. Дело в том, что я сейчас пытаюсь написать небольшую игру и заодно изучить WPF(и патерн MVVM). Чтобы не кидать сюда весь мой неоптимизированный код на 500 строк я выделил лишь часть, но теперь понимаю, что выделил не то. При помощи ListBox мне было необходимо поместить в Canvas определённое количество элементов(допустим прямоугольников), которые должны быть расположены по всей плоскости Canvas так, будто они находятся в WrapPanel: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73.
К сожалению в данном случае проблема не в реализации интерфейса INotifyPropertyChanged, а в плохих биндингах. Не могли бы Вы помочь ещё раз, пожааалуйста? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:16 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
111DarkFox111При помощи ListBox мне было необходимо поместить в Canvas определённое количество элементов(допустим прямоугольников), которые должны быть расположены по всей плоскости Canvas так, будто они находятся в WrapPanel:А зачем? Скажите листбоксу, чтобы использовал WrapPanel в качестве внутренней панели - и все. А если функционала WrapPanel недостаточно, сделайте свою панель. Это проще, чем кажется, и сделает вас волшебником в своих глазах ) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:20 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:26 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
111DarkFox111.......... При помощи ListBox мне было необходимо поместить в Canvas определённое количество элементов(допустим прямоугольников), которые должны быть расположены по всей плоскости Canvas так, будто они находятся в WrapPanel ..........Честно говоря совершено не понял Вашей идеи. Если нужна WrapPanel почему тогда её и не использовать как написал Shocker.Pro ? Зачем из Canvas имитировать WrapPanel ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:36 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Да я знаю про WrapPanel и использовал его до этого, но теперь мне нужны координаты, потому что я собираюсь перемещать элементы уже после добавления их в Canvas. Создание своей собственной панели? Я не знал о такой возможности, но мне кажется что здесь она не поможет. Даже если я объединю функционал WrapPanel и Canvas мне всё равно будут нужны привязки координат элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:40 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
111DarkFox111Да я знаю про WrapPanel и использовал его до этого, но теперь мне нужны координаты, потому что я собираюсь перемещать элементы уже после добавления их в Canvas. Создание своей собственной панели? Я не знал о такой возможности, но мне кажется что здесь она не поможет. Даже если я объединю функционал WrapPanel и Canvas мне всё равно будут нужны привязки координат элементов.То есть, есть какой-то набор фигур. В списке есть уже правильно расставленные координаты. Надо только по этим координатам вывести эти фигуры. Хотя в начале расстановка подобна WrapPanel, потом она меняется. Я правильно понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:45 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
создайте свою панель и размещайте там элементы как вашей душе угодно ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:53 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Сейчас объясню максимально подробно. Эти фигуры(прямоугольники), на самом деле являются игровым полем, по которому будет перемещаться игровой персонаж. У каждого такого прямоугольника есть свойства, определяющие является ли он обычной поверхностью или стеной. Собственно для обработки коллизии персонажа со стеной мне необходимы координаты. Да и для перемещения самого персонажа нужны его координаты. Правда как я буду добавлять персонажа на Canvas после всех фигур в патерне MVVM я ещё не придумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:54 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Например, панель может читать присоединяемые свойства своих детей как, к примеру, поступает Grid. В то же время эти свойства можно привязывать к модели представления. То есть объявить координаты присоединяемыми свойствами и нацепить их на свои элементы ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:55 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
111DarkFox111Сейчас объясню максимально подробно. Эти фигуры(прямоугольники), на самом деле являются игровым полем, по которому будет перемещаться игровой персонаж. У каждого такого прямоугольника есть свойства, определяющие является ли он обычной поверхностью или стеной. Собственно для обработки коллизии персонажа со стеной мне необходимы координаты. Да и для перемещения самого персонажа нужны его координаты. Правда как я буду добавлять персонажа на Canvas после всех фигур в патерне MVVM я ещё не придумал.Здесь я точно Вам не помощник. Я сам то ещё 4 месяцев нет как с WPF познакомился. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 23:08 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Shocker.ProНапример, панель может читать присоединяемые свойства своих детей как, к примеру, поступает Grid. В то же время эти свойства можно привязывать к модели представления. То есть объявить координаты присоединяемыми свойствами и нацепить их на свои элементы Похоже, что самый простой способ для меня сейчас это всё же сделать через Grid и создать метод, который будет конвертировать значения X и Y в значения для Margin. В любом случае спасибо, что потратили время на вопросы такого неофита как я. Можете ткнуть носом в материал о том как создавать свои панели? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 23:36 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
https://professorweb.ru/my/WPF/Template/level18/18_11.php https://professorweb.ru/my/WPF/Template/level18/18_12.php ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 23:42 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 00:03 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Хм, для такого поля вообще подойдет обычный грид с набором фиксированных строк и столбцов, а координаты хранить в Grid.Column и Grid.Row ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 00:06 |
|
Привязка координат элемента в Canvas
|
|||
---|---|---|---|
#18+
Shocker.ProХм, для такого поля вообще подойдет обычный грид с набором фиксированных строк и столбцов, а координаты хранить в Grid.Column и Grid.RowДа, действительно так. Зачем выдумки с ListBox и Canvas? Один Grid для фона, и сверху его накрыть другой панелью, можно Canvas, для персонажа. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 00:49 |
|
|
start [/forum/topic.php?fid=21&msg=39727716&tid=1440381]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 402ms |
0 / 0 |