1

wpfでドラッグアンドドロップコントロールを作成して、2つのリストボックス間でデータをドラッグアンドドロップしました。これは、別のプロジェクトに移動するまで魅力的でした。

違いは、最初はwpfウィンドウであり、ウィンドウオブジェクトを使用してマウスの位置と内部のコントロールの位置を取得したことです。

this.topWindow = Window.GetWindow(this.sourceItemsControl); //Source items control is instance of ItemsControl

bool previousAllowDrop = this.topWindow.AllowDrop;
this.topWindow.AllowDrop = true;

これは、Windowsフォームプロジェクトであるより大きなプロジェクトの一部であり、ビューはメインプロジェクトからスマートパーツとしてリンクされているため、代わりにユーザーコントロールに変更する必要がありました。したがって、Windowオブジェクトはnullになります。

ユーザーコントロールの同様の機能を探しましたが、見つかりませんでした。私が見逃しているのは何ですか?私は何かがあるはずだと知っています..同じことについて何か助けていただければ幸いです..

PS:私はMVVMアーキテクチャを使用しています

4

2 に答える 2

1

再帰を使用して基本ユーザーコントロールを見つける方法を見つけました。頭を上げてくれたekholmに感謝します。

public static UserControl FindParentControl(DependencyObject child)
        {
            DependencyObject parent = VisualTreeHelper.GetParent(child);

            //CHeck if this is the end of the tree
            if (parent == null) return null;

            UserControl parentControl = parent as UserControl;
            if (parentControl != null)
            {
                return parentControl;
            }
            else
            {
                //use recursion until it reaches a Window
                return FindParentControl(parent);
            }
        } 

AllowDrop, DragEnter, DragOverこれで、この基本ユーザーコントロールを使用して、座標(参照)を検索したり、などの他のプロパティを設定したりできます。

于 2012-08-15T20:20:28.553 に答える
-1

MVVMが必要な場合は、このソリューションを検討するよりも、.xamlファイルに次を追加します。

<ContentControl Content="{Binding Content, Mode=TwoWay}" AllowDrop="True" Name="myDesignerContentControl" />

ViewModelに追加するよりも、以下を追加します。

private Panel _content;
    public Panel Content {
        get { return _content; }
        set {
            _content = value;
            if (_content != null) {
                RegisterDragAndDrop();
            }
            base.RaisePropertyChanged("Content");
        }
    }
private void RegisterDragAndDrop() {
    Content.Drop += OnDrop;
    Content.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
    Content.PreviewDragOver += OnDragOver;
}

private void OnDesignerDrop(object sender, DragEventArgs e) {
    //some custom logic handling
}
private void OnDesignerMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
    var control = (FrameworkElement)e.Source;
    //some custom logic handling for doing drag & drop
}
private void OnDesignerDragOver(object sender, DragEventArgs e) {
    //some custom logic handling for doing drag over
}

アイデアは、マウスの位置の代わりにコントロールを使用する必要があるということです。これは、より単純で論理的なアプローチになります。上記のコードは、一部のコントロールのドラッグアンドドロップを実行できるコンテンツ領域を作成するためにMVVMで使用するアプローチの例です。背後にある考え方は、同じコンテンツ領域にある2つのリストボックス間でデータをドラッグアンドドロップする場合にも適しています。

お役に立てれば。

于 2012-08-10T13:01:43.620 に答える