|
Как победить баг с Grid.Row/Column ?!
|
|||
---|---|---|---|
#18+
Создал простое AP-свойство для упрощения привязок из шаблона элемента. Вместо такой: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Можно применять такую: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Само AP-свойство: Код: 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.
В свойстве ничего сложного. С Canvas аналогичное работает "на Ура". А с Grid возникают проблемы при присоединении коллекции с элементами или при добавлении первого элемента в коллекцию - элементы выводятся в Grid без учёта их позиции. Хотя при просмотре в визуальном дереве и обозревателе свойств присоединённые свойства Grid.Row/Column заданы правильны. И при малейших изменениях окна элементы встают по своим местам. На мой взгляд, откровенный баг. Но как с ним бороться? Полный демо-XAML Код: xml 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.
[youtube= ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2020, 13:36 |
|
Как победить баг с Grid.Row/Column ?!
|
|||
---|---|---|---|
#18+
После долгих поисков, причина оказалась в особенностях работы ItemsControl и Grid. Элементы коллекции из источника ItemsControl создаются в одной задаче. И им изначально задаётся позиция из стиля элемента. Если в этой же задаче изменять позицию, то Grid в логике своих AP свойств не отрабатывает это новое значение. Почему так сделано - надо слишком глубоко лезть в реализацию Grid. Пока такой необходимости у меня нет. Возможно (наиболее вероятно), это связанно с тем, что позиция элемента может влиять на размеры строки и колонки. И обработка позиции происходит в два прохода. Сначала измерение размеров элемента и установка размеров строк и колонок. А потом выделение контейнеров ячеек и установка в них элементов. Найденное мною решение (в том числе из обсуждения https://stackoverflow.com/questions/62202419/how-to-defeat-a-bug-with-grid-row-column-in-itemspaneltemplate) - это асинхронная установка значений через обращение к Dispatcher.BeginInvoke(). Код: 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.
Кому интересно - полная тема здесь Присоединённые свойства (Attached Property) для всплывающей привязки из шаблонов данных к Canvas и Grid. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 22:38 |
|
|
start [/forum/topic.php?fid=21&tid=1440271]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
37ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 139ms |
0 / 0 |