Перетаскивание в dataGrid, пользовательский курсор во время перетаскивания не работает - PullRequest
0 голосов
/ 17 декабря 2009

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

вот псевдо-демонстрация проблемы

Приложение = нормальный курсор // отлично

Rollover datagrid = курсор в виде открытой руки // пока хорошо

mousedown на datagrid = курсор закрытой руки // хорошо

перетаскивание элемента вокруг = курсор закрытой руки // переключается обратно на обычный курсор (если я перемещаю его очень быстро, я на мгновение вижу свой пользовательский курсор)

наведите курсор мыши на datadrid = курсор открытой руки // не уверен, после того, как я уронил его, он возвращается к открытой руке, но если я нажимаю вниз, не двигаюсь и не поднимаю мышь, у меня закрытая рука

развертывание datagrid = нормальный курсор // хорошо

код данных:

<mx:DataGrid id="sectQuestionsDG" x="10" y="204" width="558" height="277" headerHeight="0" selectable="{editMode}"
dragMoveEnabled="{editMode}" dragEnabled="{editMode}" dropEnabled="{editMode}"
dragDrop="sectQuestReOrder(event);" rollOver="over();" mouseDown="down();" mouseUp="up();" rollOut="out();"/>

функции:

public function over():void{
CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,0,0);
}
public function down():void{
CursorManager.setCursor(grabbingCursor,CursorManagerPriority.HIGH,0,0);
}
public function up():void{
CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,0,0);
}
public function out():void{
CursorManager.removeAllCursors();
}

Редактировать 17.12.09: Я немного продвинулся, сейчас делаю это на rollOver

var styleSheet:CSSStyleDeclaration = StyleManager.getStyleDeclaration("DragManager");
styleSheet.setStyle("moveCursor", grabbingCursor);
CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW);

Это дает мне правильный ролловер и правильное перетаскивание, но если я попытаюсь добавить функция, чтобы свернуть это снова облажается, так что теперь я застрял с grabCursor. Это Похоже, когда я установил rollOut на dataGrid, он запускается для каждой строки, то же самое с mouseOut, есть ли способ избежать этого?

Редактировать 21.12.09: Это подтвержденная вещь, которая выкатывает / наводит мышь на огонь для каждого элемента в сетке данных. Решение, которое мне нужно, состоит в том, как предотвратить это и запустить его только тогда, когда пользователь отключается от сетки данных в целом. Мне нужно прогнуться, чтобы увидеть лес, а не деревья.

PS. свиток срабатывает только при каждом перетаскивании. мышка срабатывает на каждый предмет, независимо от того,


РЕДАКТИРОВАТЬ 21.12.09, Конец дня:
Мне удалось ответить на мой собственный вопрос, поэтому мой представитель за вознаграждение был потерян для меня :-( В любом случае, так как мой ответ решает мою проблему, я назначу награду любому, кто может ответить на это. Мое решение использует AS для удаления rollOut / rollOver, пока пользователь перетаскивает. В dataGrid. Как можно получить тот же результат, не удаляя rollOut / rollOver (чтобы rollOut не срабатывал для каждого элемента, когда вы перетаскивали на него другой элемент)?

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Почему бы не использовать свойство isDragging из DragManager, если вы делаете перетаскивание, вам не нужно менять курсор. И не забудьте проверить наличие события dragExit на случай, если вы выйдете за пределы таблицы данных.

N.B иногда курсор остается с перетаскиваемой формой после перетаскивания, чтобы вы могли sectQuestReOrder удалить курсор и вернуть его в состояние «поверх».

образец:

public function over(evt:Event):void{ //on mouse over, added with AS
  if (DragManager.isDragging) // you are dragging so no cursor changed
   return;

  CursorManager.removeAllCursors();
  CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,-7,-7);
  var styleSheet:CSSStyleDeclaration = StyleManager.getStyleDeclaration("DragManager");
  styleSheet.setStyle("moveCursor",grabbingCursor); //style set for the drag cursor
}
public function down(evt:Event):void{ // on mouse down
    CursorManager.removeAllCursors();
    CursorManager.setCursor(grabbingCursor,CursorManagerPriority.LOW,-7,-7);     
}
public function up(evt:Event):void{
    CursorManager.removeAllCursors();
    CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,-7,-7);
}
public function out(evt:Event):void{
 if (DragManager.isDragging) // you are dragging so no cursor changed
  return;
 CursorManager.removeAllCursors();
}
public function sectQuestReOrder(e:Event):void{
    // sometime you will be stuck with the moving cursor
    // so after the drop done reset cursor to what you want
 CursorManager.removeAllCursors();
 CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,-7,-7);
 ...
}
public function onDragExit(e:Event):void {
    // in case you go out of the datagrid reset the cursor
    // so when you do a drop outside you ll not get one of your dragging cursor
 CursorManager.removeAllCursors();
}

И в вашей сетке добавьте dragExit

 <mx:DataGrid 
      id="sectQuestionsDG" 
      x="10" y="204" width="558" height="277" headerHeight="0" 
      selectable="{editMode}"
      dragExit="onDragExit(event)"
      dragMoveEnabled="{editMode}" 
      dragEnabled="{editMode}"
      dropEnabled="{editMode}"
      dragDrop="sectQuestReOrder(event);" 
      rollOver="over(event);" 
      mouseDown="down(event);" 
      mouseUp="up(event);" 
      rollOut="out(event);"/>
1 голос
/ 21 декабря 2009

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

0 голосов
/ 22 декабря 2009

ОК, некоторые реквизиты для Габриэля, чтобы он вытащил мой разум из колеи и вернулся к этой проблеме в полном режиме. Мне пришлось пройти несколько шагов, чтобы получить ответ

1) удалите прослушиватели для rollOver, rollOut и mouseUp из mxml и добавьте rollOver и rollOut через метод addEventListener в AS

2) добавьте слушатель dragComplete в mxml и назначьте ему ранее назначенную функцию mouseUP

3) измените основную функцию следующим образом:

public function over(evt:Event):void{ //on mouse over, added with AS
    CursorManager.removeAllCursors();
    CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,-7,-7);
    var styleSheet:CSSStyleDeclaration = StyleManager.getStyleDeclaration("DragManager");
    styleSheet.setStyle("moveCursor",grabbingCursor); //style set for the drag cursor
}
public function down(evt:Event):void{ // on mouse down
    CursorManager.removeAllCursors();
    CursorManager.setCursor(grabbingCursor,CursorManagerPriority.LOW,-7,-7);
    sectQuestionsDG.removeEventListener(MouseEvent.ROLL_OVER,over);
    sectQuestionsDG.removeEventListener(MouseEvent.ROLL_OUT,out);
    //this is why I had to take it off the mxml, can only remove listeners
    //added with the addEventListener, I don't remember where I read that.
}
public function up(evt:Event):void{
    CursorManager.removeAllCursors();
    CursorManager.setCursor(grabCursor,CursorManagerPriority.LOW,-7,-7);
    sectQuestionsDG.addEventListener(MouseEvent.ROLL_OVER,over);
    sectQuestionsDG.addEventListener(MouseEvent.ROLL_OUT,out);
}
public function out(evt:Event):void{
    CursorManager.removeAllCursors();
}
...