2009-11-19 11 views
1

J'essaie d'héberger le Workflow Designer dans une application WPF. Le contrôle WorkflowView est hébergé sous un contrôle WindowsFormsHost. J'ai réussi à charger des workflows sur le concepteur qui est lié avec succès à un PropertyGrid, également hébergé dans un autre WindowsFormsHost.Impossible de faire glisser les activités de WPF ListBox dans WorkflowView

WorkflowView workflowView = rootDesigner.GetView(ViewTechnology.Default) as WorkflowView; 
window.WorkflowViewHost.Child = workflowView; 

La majorité du code rehosting est le même que dans http://msdn.microsoft.com/en-us/library/aa480213.aspx.

J'ai créé une boîte à outils personnalisée à l'aide d'un contrôle ListBox WPF lié à une liste de ToolboxItems.

<ListBox Grid.Row="1" Margin="0 0 0 4" BorderThickness="1" BorderBrush="DarkGray" ItemsSource="{Binding Path=ToolboxItems}" PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown" AllowDrop="True"> 
<ListBox.Resources> 
    <vw:BitmapSourceTypeConverter x:Key="BitmapSourceConverter" /> 
</ListBox.Resources> 
<ListBox.ItemTemplate> 
    <DataTemplate DataType="{x:Type dd:ToolboxItem}"> 
    <StackPanel Orientation="Horizontal" Margin="3"> 
    <Image Source="{Binding Path=Bitmap, Converter={StaticResource BitmapSourceConverter}}" Height="16" Width="16" Margin="0 0 3 0"  /> 
    <TextBlock Text="{Binding Path=DisplayName}" FontSize="14" Height="16" VerticalAlignment="Center" /> 
    <StackPanel.ToolTip> 
    <TextBlock Text="{Binding Path=Description}" /> 
    </StackPanel.ToolTip> 
    </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

Dans le gestionnaire ListBox_PreviewMouseLeftButtonDown:

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
ListBox parent = (ListBox)sender; 

UIElement dataContainer; 
//get the ToolboxItem for the selected item 
object data = GetObjectDataFromPoint(parent, e.GetPosition(parent), out dataContainer); 

//if the data is not null then start the drag drop operation 
if (data != null) 
{ 
    DataObject dataObject = new DataObject(); 
    dataObject.SetData(typeof(ToolboxItem), data); 

    DragDrop.DoDragDrop(parent, dataObject, DragDropEffects.Move | DragDropEffects.Copy); 
} 
} 

Avec cette configuration, je ne peux pas faire glisser un élément de ma boîte à outils sur mesure sur le concepteur. Le curseur est toujours affiché comme "Non" n'importe où sur le concepteur.

J'ai essayé de trouver quelque chose à ce sujet sur le net pendant une demi-journée maintenant et j'espère vraiment que certains peuvent m'aider ici.

Tout commentaire est très apprécié. Je vous remercie!

Carlos

Répondre

0

Enfin, le glisser-déposer a fonctionné. 1. J'ai dû utiliser System.Windows.Forms.DataObject à la place de System.Windows.DataObject lors de la sérialisation de ToolboxItem lors de l'exécution de DragDrop. Il y avait trois choses à faire, quelle que soit la raison de WorkflowView:

private void ListBox_MouseDownHandler(object sender, MouseButtonEventArgs e) 
{ 
    ListBox parent = (ListBox)sender; 

    //get the object source for the selected item 
    object data = GetObjectDataFromPoint(parent, e.GetPosition(parent)); 

    //if the data is not null then start the drag drop operation 
    if (data != null) 
    { 
     System.Windows.Forms.DataObject dataObject = new System.Windows.Forms.DataObject(); 
     dataObject.SetData(typeof(ToolboxItem), data as ToolboxItem); 
     DragDrop.DoDragDrop(this, dataObject, DragDropEffects.Move | DragDropEffects.Copy); 
    } 
} 

2.) la source DragDrop.DoDragDrop doit être réglé sur l'ensemble IToolboxService dans le IDesignerHost. Le contrôle contenant ListBox implémente IToolboxService.

// "this" points to ListBox's parent which implements IToolboxService. 
DragDrop.DoDragDrop(this, dataObject, DragDropEffects.Move | DragDropEffects.Copy); 

3.) La zone de liste doit être lié à une liste de ToolboxItems renvoyés par la méthode d'assistance suivante, en lui transmettant le type des activités à afficher dans la boîte à outils:

... 
this.ToolboxItems = new ToolboxItem[] 
    { 
     GetToolboxItem(typeof(IfElseActivity)) 
    }; 
... 

internal static ToolboxItem GetToolboxItem(Type toolType) 
{ 
    if (toolType == null) 
     throw new ArgumentNullException("toolType"); 

    ToolboxItem item = null; 
    if ((toolType.IsPublic || toolType.IsNestedPublic) && typeof(IComponent).IsAssignableFrom(toolType) && !toolType.IsAbstract) 
    { 
     ToolboxItemAttribute toolboxItemAttribute = (ToolboxItemAttribute)TypeDescriptor.GetAttributes(toolType)[typeof(ToolboxItemAttribute)]; 
     if (toolboxItemAttribute != null && !toolboxItemAttribute.IsDefaultAttribute()) 
     { 
      Type itemType = toolboxItemAttribute.ToolboxItemType; 
      if (itemType != null) 
      { 
       // First, try to find a constructor with Type as a parameter. If that 
       // fails, try the default constructor. 
       ConstructorInfo ctor = itemType.GetConstructor(new Type[] { typeof(Type) }); 
       if (ctor != null) 
       { 
        item = (ToolboxItem)ctor.Invoke(new object[] { toolType }); 
       } 
       else 
       { 
        ctor = itemType.GetConstructor(new Type[0]); 
        if (ctor != null) 
        { 
         item = (ToolboxItem)ctor.Invoke(new object[0]); 
         item.Initialize(toolType); 
        } 
       } 
      } 
     } 
     else if (!toolboxItemAttribute.Equals(ToolboxItemAttribute.None)) 
     { 
      item = new ToolboxItem(toolType); 
     } 
    } 
    else if (typeof(ToolboxItem).IsAssignableFrom(toolType)) 
    { 
     // if the type *is* a toolboxitem, just create it.. 
     // 
     try 
     { 
      item = (ToolboxItem)Activator.CreateInstance(toolType, true); 
     } 
     catch 
     { 
     } 
    } 

    return item; 
} 

méthode GetToolboxItem provient de http://msdn.microsoft.com/en-us/library/aa480213.aspx source, dans la classe ToolboxService.

Cheers, Carlos

0

Cela peut paraître stupide que mon système est en cours d'arrêt. :) Mais pouvez-vous vérifier votre WorkflowView pour savoir si AllowDrop est défini? Avez-vous géré l'événement DragEnter?

+0

Oui, j'ai vérifié à la fois AllowDrop dans les contrôles WindowsFormsHost et WorkflowView et ils sont tous deux mis à true. J'ai également traité le DragEvent et le champ d'argument e.Data contient l'équivalent System.Windows.Forms.DataObject du System.Windows.DataObject que j'ai fait avant d'appeler DragDrop.DoDragDrop. J'ai été en mesure d'obtenir le ToolboxItem de e.Data très bien. – ca7l0s