0

指定されたコードは、コントロールの1つのインスタンスをドラッグアンドドロップすることで正常に機能します。同じインスタンスを再度削除しようとすると、例外がスローされます。

指定された要素は、すでに別の要素の論理的な子です。最初に切断します。

Visual Studioツールボックスと同様に、ユーザーコントロールの複数のインスタンスをCanvasにドロップするにはどうすればよいですか?

public MainWindow()
{
    InitializeComponent();
    LoadUsercontrols();
}

private void LoadUsercontrols()
{
    List<string> userControlKeys = new List<string>();
    userControlKeys.Add("testCtrl1");
    userControlKeys.Add("testCtrl2");

    Type type = this.GetType();
    Assembly assembly = type.Assembly;
    foreach (string userControlKey in userControlKeys)
    {
        userControlFullName = String.Format("{0}.TestControls.{1}", type.Namespace, userControlKey);
        UserControl userControl = new UserControl();
        userControl = (UserControl)assembly.CreateInstance(userControlFullName);
        _userControls.Add(userControlKey, userControl);
    }
}

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

private void TreeViewItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
    // Get the current mouse position
    System.Windows.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)
    {
        TreeView treeView = sender as TreeView;
        TreeViewItem treeViewItem = FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);

        if (treeViewItem != null)
        {
            Type type = this.GetType();
            Assembly assembly = type.Assembly;
            DataObject dragData = new DataObject("myFormat", _userControls[((System.Windows.Controls.HeaderedItemsControl)(treeViewItem)).Header.ToString()]);
            DragDrop.DoDragDrop(treeViewItem, dragData, DragDropEffects.Copy);
        }
    }
}

private static T FindAnchestor<T>(DependencyObject current) where T : DependencyObject
{
    do
    {
        if (current is T)
        {
            return (T)current;
        }
        current = VisualTreeHelper.GetParent(current);
    }
    while (current != null);
    return null;
}

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

private void MyDesignerCanvas_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent("myFormat"))
    {
        if (treeItem != null)
        {
            UserControl myCanvasItem = e.Data.GetData("myFormat") as UserControl;
            UserControl newCanvastItem = new UserControl
            {
                Content = _userControls[((System.Windows.Controls.HeaderedItemsControl)(treeItem)).Header.ToString()]
            };
            Point position = e.GetPosition(MyDesignerCanvas);
            DesignerCanvas.SetLeft(newCanvastItem, position.X);
            DesignerCanvas.SetTop(newCanvastItem, position.Y);
            DesignerCanvas.SetZIndex(newCanvastItem, 1);
            MyDesignerCanvas.Children.Add(newCanvastItem);
        }
    }
}

XAMLコードの場合:

<TreeView x:Name="presetTreeView4" Grid.Row="1" >
    <TreeViewItem Header="testCtrl1" Selected="TreeViewItem_Selected" PreviewMouseLeftButtonDown="TreeViewItem_PreviewMouseLeftButtonDown" PreviewMouseMove="TreeViewItem_PreviewMouseMove"/>
    <TreeViewItem Header="testCtrl2" Selected="TreeViewItem_Selected" PreviewMouseLeftButtonDown="TreeViewItem_PreviewMouseLeftButtonDown" PreviewMouseMove="TreeViewItem_PreviewMouseMove"/>
</TreeView>
<s:DesignerCanvas x:Name="MyDesignerCanvas" AllowDrop="True" Drop="MyDesignerCanvas_Drop" DragEnter="MyDesignerCanvas_DragEnter"  Background="#A6B0D2F5" DockPanel.Dock="Bottom" Margin="0" >
</s:DesignerCanvas>
4

2 に答える 2

1

同じコントロールを異なるコンテナに追加することはできません。コントロールはビジュアルツリーに1回だけ表示できます。

事前にユーザーコントロールをロードする代わりに、でそれらを構築しMyDesignerCanvas_Drop(つまりActivator、で現在使用しているのと同じ方法で使用LoadUsercontrols)、結果のコントロールをに割り当てる必要がありUserControl.Contentます。

于 2012-04-25T09:15:25.023 に答える
0

_userControls[((System.Windows.Controls.HeaderedItemsControl)(treeItem)).Header.ToString()]コントロールのクローンを作成する必要があると思いますMyDesignerCanvas_Drop

于 2012-04-25T09:08:23.140 に答える