SL4: необходимо зарегистрироваться для события перемещения (или перерисовки) элемента в ItemControl - PullRequest
0 голосов
/ 18 сентября 2011

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

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

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

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

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

this.myItem.LayoutUpdated += this.OnSomethingNeedsToUpdate;

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

Также

this.myItem.MouseMove += this.OnSomethingNeedsToUpdate;

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

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

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

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

0 голосов
/ 20 сентября 2011

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

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
    }
}

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

...