私はthis answerを使用し、いくつかの修正を追加しました。
ItemControl
を使用して、さまざまなオブジェクトを含むビューを作成しました。こうすることで、オブジェクトをリストに追加するだけで画像を追加することができます。コンテナはCanvas
ですが、位置がRenderTransform
によって制御されているので、何もすることができます:ここでは
<ItemsControl Name="MainView" ItemsSource="{Binding ListObjects}">
<ItemsControl.ItemsPanel >
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:MVDragableObject}">
<local:DragableObject/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
が背後にあるコードです。いくつかの基本的なModelView:
public class MVObjectManager
{
public ObservableCollection<MVDragableObject> ListObjects { get; set; }
public MVObjectManager()
{
ListObjects = new ObservableCollection<MVDragableObject>();
}
}
public class MVDragableObject
{
}
そして、コンテナを塗りつぶしてバインドするコード。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MVObjectManager Manager=new MVObjectManager();
Manager.ListObjects.Add(new MVDragableObject());
Manager.ListObjects.Add(new MVDragableObject());
Manager.ListObjects.Add(new MVDragableObject());
MainView.DataContext = Manager;
}
}
を、私は非常に単純なUserControl
を定義して:あなたは、私がコレクションに3つの項目を追加したことに気づくことができます。それは、それをカスタマイズするのはあなた次第です:
<UserControl x:Class="StackFill.DragableObject"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
<Grid>
<Rectangle Fill="Red" Height="30" Width="30"/>
</Grid>
</UserControl>
そして、ここでは、その背後にあるコードはドラッグ&ドロップ行動を管理している:
public partial class DragableObject : UserControl
{
public DragableObject()
{
InitializeComponent();
this.MouseLeftButtonDown += new MouseButtonEventHandler(DragableObject_MouseLeftButtonDown);
this.MouseLeftButtonUp += new MouseButtonEventHandler(DragableObject_MouseLeftButtonUp);
this.MouseMove += new MouseEventHandler(DragableObject_MouseMove);
}
protected bool isDragging;
private Point clickPosition;
private void DragableObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
isDragging = true;
var draggableControl = sender as UserControl;
clickPosition = e.GetPosition(this.Parent as UIElement);
draggableControl.CaptureMouse();
}
private void DragableObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isDragging = false;
var draggable = sender as UserControl;
draggable.ReleaseMouseCapture();
}
private void DragableObject_MouseMove(object sender, MouseEventArgs e)
{
var draggableControl = sender as UserControl;
if (isDragging && draggableControl != null)
{
Point currentPosition = e.GetPosition(this.Parent as UIElement);
var transform = draggableControl.RenderTransform as TranslateTransform;
if (transform == null)
{
transform = new TranslateTransform();
draggableControl.RenderTransform = transform;
}
transform.X = snapPosition(currentPosition.X - clickPosition.X, 10);
transform.Y = snapPosition(currentPosition.Y - clickPosition.Y, 10);
}
}
private double snapPosition(double position, double gridSize)
{
return (Math.Truncate(position/gridSize) * gridSize);
}
}
あなたはグリッド寸法引数を変更することにより、スナップ精度を制御することができます。
出典
2017-12-22 02:17:05
Bob
質問を単純化する必要があります。コーディングの問題に直ちに進み、可能であればいくつかのコードを共有してください。あなたは基本的にスナップグリッドでドラッグ&ドロップをしたいのですが、そうですか?何を試しましたか? – Bob
はい、基本的に私はそれをしたいと思います。私は自分のコードを共有することができましたが、それはごみの処理です。テストのために、プラグ(通常は複数の図形が含まれています)用の矩形の「シンプルな」プロジェクトを作成しました。私は矩形をキャンバスに、キャンバスをメインキャンバスに入れました。 Canvasは枠線をサポートしておらず、ユーザーとのやりとりをしているので、私はUserControl内に長方形を置くのが良いと思いました。私が書き直す前に、プラグ・ジオメトリの正しい「コンテナ」が正しいことを確認したいだけです。また、私の問題は非常に具体的で、正直なところ、それをよりよく説明する方法が分からない。 – Alex