質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

2143閲覧

wpfでのドラッグアンドドロップについて

arw.tyx-out_mz

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/06/21 13:02

編集2019/06/22 03:15

前提・実現したいこと

WPFで図形をCanvasにドラッグアンドドロップしたいです.
ただし,対象の図形自体をドラッグするのではなくて,コピーしたものを作成してドラッグしたいです.

ソースコード

Xaml

1<UsersControl.Resources> 2 <sys:Double x:Key="Radius">20</sys:Double> 3 <Style x:Key="TargetPointStyle" TargetType="{x:Type Path}" BasedOn="{StaticResource BasePointStyle}"> 4 <Setter Property="Fill" Value="Red" /> 5 <Setter Property="Stroke" Value="Red" /> 6 </Style> 7 8 <Style x:Key="BaseTextStyle" TargetType="{x:Type TextBlock}"> 9 <Setter Property="Opacity" Value="0.8" /> 10 <Setter Property="FontSize" Value="16" /> 11 </Style> 12 13 <Style x:Key="TargetTextStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseTextStyle}"> 14 <Setter Property="Foreground" Value="Red" /> 15 </Style> 16</UsersControl.Resources> 17 18<!-- 省略 --> 19 20<TextBlock Text="Target Point" 21 Style="{StaticResource TargetTextStyle}" 22 Canvas.Left="10" 23 Canvas.Top="10"/> 24<!-- これをコピーしてドラッグしたい --> 25<Path Style="{StaticResource TargetPointStyle}"> 26 <Path.Data> 27 <EllipseGeometry Center="130 20" 28 RadiusX="{StaticResource Radius}" 29 RadiusY="{StaticResource Radius}"/> 30 </Path.Data> 31</Path> 32 33 34<!-- ここにドロップしたい --> 35<Canvas Grid.Row="1" Height="512" Width="512"> 36 <Image Source="sample.jpg" Stretch="UniformToFill"/> 37</Canvas>

調べたこと

自分で調べる限り,

の3種類が見つかりましたが,ItemsControlの派生クラス(リストボックスなど)の中でItemを並び替えたりという例が多い印象でした.
自分のやりたいこととは,Canvasの外側に設置してあるEllipseなどのShapeを,ドラッグアンドドロップでCanvasの上に持ってくることなので,少し調査結果とは違うのかなと思いました.
また,調べた内容では,Item自体をドラッグアンドドロップして動かすので,移動させたあとは,元の位置にはItemはないという状態が基本でした.
しかし,自分の場合は,コピーしたものをドラッグアンドドロップをしたいので,最終的にはCanvasの外側とCanvasの上にShapeが存在している状態にしたいです.

どのように実現すればいいのか,わからないのでご教示お願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/06/22 01:52

やりたいことを具体的に書いてください。
arw.tyx-out_mz

2019/06/22 03:15

追記したので確認していただけると助かります.
guest

回答2

0

WPFで図形をCanvasにドラッグアンドドロップしたいです.
ただし,対象の図形自体をドラッグするのではなくて,コピーしたものを作成してドラッグしたいです.

こちらは公式のサンプルです。
チュートリアル: ユーザー コントロールでのドラッグ アンド ドロップの有効化 - WPF .NET Framework | Microsoft Learn

なかなか盛りだくさんですが、最後に図形の移動をしています。
それをCanvasに変更し、図形のコピーのみの最低限のコードしました。

xml:MainWindow.xaml

1<Window 2 x:Class="Q196305.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Q196305" 6 Width="800" 7 Height="450"> 8 <Grid> 9 <Grid.ColumnDefinitions> 10 <ColumnDefinition Width="Auto" /> 11 <ColumnDefinition /> 12 </Grid.ColumnDefinitions> 13 14 <StackPanel Background="Beige"> 15 <local:Circle Margin="8" CanCopy="True" /> 16 </StackPanel> 17 18 <Canvas 19 Grid.Column="1" 20 AllowDrop="True" 21 Background="Bisque" 22 ClipToBounds="True" 23 DragOver="Canvas_DragOver" 24 Drop="Canvas_Drop" /> 25 </Grid> 26</Window>

cs:MainWindow.xaml.cs

1using System.Windows; 2using System.Windows.Controls; 3 4namespace Q196305; 5 6public partial class MainWindow : Window 7{ 8 public MainWindow() => InitializeComponent(); 9 10 private void Canvas_DragOver(object sender, DragEventArgs e) 11 { 12 if (e.Data.GetDataPresent("Object")) 13 e.Effects = DragDropEffects.Copy; 14 else 15 e.Effects = DragDropEffects.None; 16 17 e.Handled = true; 18 } 19 20 private void Canvas_Drop(object sender, DragEventArgs e) 21 { 22 if (e.Handled) return; 23 24 if (sender is Canvas canvas) 25 { 26 if (e.Data.GetData("Object") is Circle) 27 { 28 var circle = new Circle(); 29 var p = e.GetPosition(canvas); 30 Canvas.SetLeft(circle, p.X - circle.Width / 2); 31 Canvas.SetTop(circle, p.Y - circle.Height / 2); 32 33 canvas.Children.Add(circle); 34 } 35 } 36 } 37}

xml:Circle.xaml

1<UserControl 2 x:Class="Q196305.Circle" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="100" 6 Height="100"> 7 <Ellipse Fill="Blue" /> 8</UserControl>

cs:Circle.xaml.cs

1using System.Windows; 2using System.Windows.Controls; 3using System.Windows.Input; 4 5namespace Q196305; 6 7public partial class Circle : UserControl 8{ 9 public bool CanCopy { get; set; } 10 11 public Circle() => InitializeComponent(); 12 13 protected override void OnMouseMove(MouseEventArgs e) 14 { 15 base.OnMouseMove(e); 16 17 if (!CanCopy || e.LeftButton != MouseButtonState.Pressed) return; 18 19 var data = new DataObject("Object", this); 20 DragDrop.DoDragDrop(this, data, DragDropEffects.Copy); 21 } 22}

アプリ動画

投稿2024/11/25 15:04

TN8001

総合スコア10049

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ドラッグ&ドロップっていうのは異なるアプリケーション間でマウス操作によるデータ連携手段として
Windowsをはじめとしたグラフィカルユーザーインターフェイスが用意している仕組みです。
ドラッグ&ドロップを実装するってことは、その仕組みを利用するってことです。
コピーも移動もWindowsのドラッグ&ドロップはサポートしてます。
Gong-wpf-dragdropなどメジャーなライブラリならまずコピーもサポートしてますので、
ちょこっと変えるだけでOKです。

投稿2019/06/22 03:33

編集2019/06/22 03:48
hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問