Могу ли я сделать это проще? Бублинг против туннелирования в WPF? - PullRequest
1 голос
/ 28 января 2011

Я работаю с функцией перетаскивания в приложении WPF.

У меня есть такая древовидная структура.

StackPanel
 - Border 1
   - Grid A
     - Grid 1
     - Grid 2
 - Border 2
   - Grid B
     - Grid 1
     - Grid 2

Это моя попытка показать древовидное представление элементов UIE в моем приложении WPF.

так что панель стека содержит сетки с вложенными сетками внутри. Они определяются динамически в коде, а не в XAML.

У меня есть внутренние сетки (1 и 2), обрабатывающие события перетаскивания. Проблема, с которой я сталкиваюсь, заключается в том, что когда выполняется операция удаления, и она отбрасывается на границе одной из сеток, она падает и попадает на панель StackPanel. То, что я хотел бы сделать, - это когда элемент сбрасывается на границе, я бы хотел, чтобы он перебрасывался на тот же обработчик события отбрасывания.

Я довольно новичок в идее маршрутизируемых событий, а также событий Bubbling и Tunneling. Я знаю, что мне нужно это событие, чтобы пройти по иерархии элементов, что заставляет меня поверить, что я нуждаюсь в «Туннельном» событии. Означает ли это, что я должен прикрепить границу к обработчику событий. Прямо сейчас у меня есть следующий код для гридов, которые будут подписаны на событие.

fieldItemGrid.PreviewDrop += Grid_Drop;

private void Grid_Drop(object sender,DragEventArgs e)
{
        //React to Drop Event Here
}

Могу ли я сделать что-то попроще, чем переписать код, который идет здесь, в событии Border_Drop?

Спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Я думаю, что было бы лучше добавить очень плотный (без заполнения) контейнер (например, Grid) вокруг области, которая должна действовать как дропзона.Затем используйте плотный контейнер для обработки падения.

таким образом, не имеет значения, какие границы указаны.Только заполнение плотного контейнера или поля дочерних элементов управления может испортить его.

1 голос
/ 29 января 2011

Способ маршрутизации, работающий с событием предварительного просмотра, начинается в верхней части дерева, пока не достигнет элемента, который инициировал событие, а затем нормальное событие начинается у самого элемента и работает в направлении вершины дерева.

В вашей ситуации, если граница является целью отбрасывания, последовательность выглядит следующим образом (если событие не обрабатывается):

  • PreviewDrop -> StackPanel
  • PreviewDrop -> Border
  • Drop -> Border
  • Drop -> StackPanel

поэтому событие никогда не достигнет ни одной из внутренних сеток, когда падение происходит на элементе вне сеток. Другими словами, он никогда не будет туннелировать ни к каким дочерним элементам цели отбрасывания, потому что туннель останавливается там, где произошло отбрасывание. Имеет смысл, как узнать, какой ребенок был правильным ребенком для туннелирования, если их было больше одного?

В результате вам необходимо установить обработчик события удаления для самого большого элемента, который визуально представляет концептуальную цель удаления. Вы можете либо изменить порядок «Граница 1» и «Сетка А», либо переместить свой обработчик события сброса для «Сетка А» в «Границу 1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...