0

FrameworkElement クラスで移動イベントまたは再描画イベントが見つかりません。そして、Googleも助けません。そう...

VM の監視可能なコレクションによって設定されたカスタム ItemsControl があります。ItemsControl 自体は、

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

ユーザーがアセンブリ全体をドラッグできるようにします。

ユーザーがアセンブリを移動すると、アセンブリの移動の結果としてアイテムの位置が変更されるため、各アイテムから通知を受けたいです。これまでに登録してみました

this.myItem.LayoutUpdated += this.OnSomethingNeedsToUpdate;

しかし、アセンブリをドラッグしても発火しないようです。

また

this.myItem.MouseMove += this.OnSomethingNeedsToUpdate;

十分ではないアイテムにマウスを合わせた場合にのみ機能します。私は ItemsControl を移動しているため、イベントを発生させるにはアイテムにマウスを移動する必要があります。

何か案は?OneOfMyDecendantsWasRedrawn イベントなどの形で、ビジュアル ツリーの先祖にヘルプを求めることはできますか? 繰り返しますが、アイテムが移動したときに通知されず、アセンブリが移動したときに通知されないようにしています。

4

2 に答える 2

0

最善の策は、Xaml ではなくコードでカスタム ItemsControl に MouseDragElementBehavior を追加することです。これがどのように見えるかを次に示します (デモが簡単なため、グリッドを使用します)。

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

Custom Code Here というセクションでは、アイテムをループして、アイテムがドラッグされていることを通知します。

于 2011-09-19T22:20:05.800 に答える
0

気になる個々の項目に対して別の動作を記述し、LINQ クエリを記述してビジュアル ツリーを検索し、MouseDragElementBehavior が関連付けられた先祖を探しました。Item の最終的な親だったので、そのクエリは ItemsControl を見つけました。その後、desried として Dragging イベントに登録することができました。

ここで解決策を提供してくれた Bryant に改めて感謝します。

于 2011-09-20T06:19:59.590 に答える