SL4: необходимо зарегистрироваться для события перемещения (или перерисовки) элемента в ItemsControl

Не удалось найти событие перемещения или перерисовки в классе FrameworkElement. И Google тоже не помогает. Так...

У меня есть настраиваемый ItemsControl, заполненный наблюдаемой коллекцией в виртуальной машине. Сам ItemsControl использует

<i:Interaction.Behaviors>
    <ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
</i:Interaction.Behaviors>

поведение, чтобы пользователь мог перетащить всю сборку.

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

this.myItem.LayoutUpdated += this.OnSomethingNeedsToUpdate;

но он, кажется, не срабатывает, когда я таскаю сборку.

Также

this.myItem.MouseMove += this.OnSomethingNeedsToUpdate;

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

Любые идеи? Могу ли я обратиться за помощью к какому-либо предку в визуальном дереве в виде события OneOfMyDecendantsWasRedrawn или подобного? Я снова пытаюсь получить уведомление о перемещении элемента, но не получать уведомления о перемещении сборки.


person dFlat    schedule 18.09.2011    source источник
comment
Можете ли вы объяснить термины «деталь» и «сборка»? Все ли элементы в сборке (элементы управления) и элементы являются отдельными элементами в элементе управления? Вы перетаскиваете их все сразу или каждый элемент по отдельности?   -  person Bryant    schedule 20.09.2011
comment
@Bryant, сборка относится к ItemsControl и всем элементам, которые он содержит. Элемент относится к элементу в ItemsControl. Извините за путаницу.   -  person dFlat    schedule 20.09.2011


Ответы (2)


Я бы сказал, что лучше всего было бы добавить MouseDragElementBehavior в свой собственный ItemsControl в коде, а не в Xaml. Вот как это может выглядеть (используя сетку, поскольку это легче продемонстрировать):

public class DraggableGrid : Grid
{

    public DraggableGrid()
    {
        Loaded += new RoutedEventHandler(DraggableGrid_Loaded);
    }

    void DraggableGrid_Loaded(object sender, RoutedEventArgs e)
    {
        MouseDragElementBehavior dragable = new MouseDragElementBehavior();
        Interaction.GetBehaviors(this).Add(dragable);
        dragable.Dragging += new MouseEventHandler(dragable_Dragging);
    }    

    void dragable_Dragging(object sender, MouseEventArgs e)
    {
        // Custom Code Here
    }
}

В разделе «Пользовательский код» вы можете просмотреть свои элементы и уведомить их о том, что они перетаскиваются.

person Bryant    schedule 19.09.2011
comment
Я не могу отметить это как ответ из-за кода. Тем не менее, я хочу отдать вам должное, поскольку вы все поняли правильно. Разместите свое предложение здесь и Отмечу твой как ответ. В противном случае я выберу свой ниже и закрою эту тему. - person dFlat; 20.09.2011
comment
В этом подходе не используется программный код, это подкласс элемента управления. - person Bryant; 20.09.2011
comment
Я избегаю заимствовать элементы управления в пользу расширения поведения с помощью ... ну ... поведения. Отмечу свой как ответ. Я отдал вам должное. Я буду рад отметить другое ваше предложение как ответ, если вы разместите его здесь. Спасибо еще раз. - person dFlat; 01.10.2011

В итоге я написал другое поведение для отдельных элементов, которые меня волнуют, а затем написал запрос LINQ для поиска в визуальном дереве в поисках предков с прикрепленным к ним MouseDragElementBehavior. Этот запрос обнаружил ItemsControl, поскольку он был конечным родительским элементом для Item. Затем я смог зарегистрироваться для участия в мероприятии «Перетаскивание», как и хотел.

Еще раз спасибо Брайанту за предоставление решения здесь.

person dFlat    schedule 20.09.2011