1

タイトルが混乱しすぎていないことを願っています。それを説明する方法が完全にはわかりませんでした. ともかく!

ここに示すように、階層型DataTemplatesを含むツリービューがあります。

<TreeView.Resources>

               <HierarchicalDataTemplate DataType="{x:Type WPFFM:AssetCategoryViewModel}" ItemsSource="{Binding Path= Children}" >
                <StackPanel Orientation="Horizontal" AllowDrop="True" Drop="StackPanel_Drop" DragEnter="StackPanel_DragEnter">
                 <TextBlock Text= "{Binding Description}" ContextMenu="{StaticResource assetOverviewContextMenu}"/>
                </StackPanel>
               </HierarchicalDataTemplate>

               <HierarchicalDataTemplate DataType="{x:Type WPFFM:AssetViewModel}" ItemsSource="{Binding Children}" >
                <StackPanel Orientation="Horizontal">
                 <TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch"  ContextMenu="{StaticResource assetContextMenu}"
                                                    PreviewMouseLeftButtonDown="Asset_PreviewMouseLeftButtonDown" PreviewMouseMove="Asset_PreviewMouseMove"    />
                </StackPanel>
               </HierarchicalDataTemplate>

</TreeView.Resources>

カテゴリ ヘッダーで AllowDrop を true に設定し、2 つの間でアセットをドラッグするための処理を設定しました。ドラッグのコードは次のとおりです。

private void Asset_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        startPoint = e.GetPosition(null);
    }

    private void Asset_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        // Get the current mouse position
        Point mousePos = e.GetPosition(null);
        Vector diff = startPoint - mousePos;

        if (e.LeftButton == MouseButtonState.Pressed &&
            Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
        {


            TextBlock parentMenu = sender as TextBlock;
            AssetViewModel assetViewModelToSend = ((AssetViewModel)parentMenu.DataContext);



            // Initialize the drag & drop operation
            DataObject dragData = new DataObject("myFormat", assetViewModelToSend);
            DragDrop.DoDragDrop(parentMenu, dragData, DragDropEffects.Move);
        } 
    }

そして落とします。

private void StackPanel_Drop(object sender, DragEventArgs e)
    {
        //TextBlock parentMenu = e as TextBlock;
        //AssetCategoryViewModel assetCat = ((AssetCategoryViewModel)parentMenu.DataContext);

        //MessageBox.Show(parentMenu.Text);


        if (e.Data.GetDataPresent("myFormat"))
        {
            AssetViewModel modelBeingSent = e.Data.GetData("myFormat") as AssetViewModel;
            MessageBox.Show(modelBeingSent.Description);

        }
    }

    private void StackPanel_DragEnter(object sender, DragEventArgs e)
    {
        if (!e.Data.GetDataPresent("myFormat") ||
    sender == e.Source)
        {
            e.Effects = DragDropEffects.None;
        }
    }

これは正常に動作し、dragEventArgs からビューモデルを取得してドラッグできますが、ドラッグ先の新しいカテゴリ ビューモデルを見つける必要がありますが、ドロップ ターゲット データを取得するにはどうすればよいですか? それはおそらく送信者または引数の何かですか?

編集:明確にするために、ここに私の見解の写真があります。ドラッグ ソースは子 (ラップトップ) で、ドロップ ターゲットはカテゴリ (ハードウェアなど) です。

アセットの概要

4

2 に答える 2

-1

条件は次のとおりです。

if ((e.LeftButton == MouseButtonState.Pressed && (
        Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
        Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))

AND は MouseButtonState.Pressed に対して、OR は他の両方の条件に対して !

于 2016-04-08T06:39:31.310 に答える