2010-07-12 14 views
4

En utilisant une activité de code (c'est-à-dire une activité construite en C#), nous pouvons ajouter des attributs de catégorie à nos propriétés et les afficher dans la grille de propriétés du concepteur de flux de travail.Catégorisation des propriétés des activités XAML

[RequiredArgument] 
    [Category("Input")] 
    public InArgument<Guid> TermbaseId { get; set; } 

La même fonctionnalité est-elle possible dans une activité XAML?

Edit: Inclus exemple XAML: Je voudrais ajouter [Catégorie ("Entrée")] In et [Catégorie ("Sortie")] Out dans les domaines suivants Xaml

<Activity mc:Ignorable="sap" x:Class="ActivityLibrary1.Activity1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <x:Members> 
    <x:Property Name="In" Type="InArgument(x:String)" /> 
    <x:Property Name="Out" Type="OutArgument(x:String)" /> 
    </x:Members>  
<sap:VirtualizedContainerService.HintSize>240,240</sap:VirtualizedContainerService.HintSize> 
    <mva:VisualBasic.Settings>Assembly references and imported namespaces for internal implementation</mva:VisualBasic.Settings> 
</Activity> 
+0

Vous ne pouvez pas définir de propriétés dans Xaml (vous pouvez uniquement définir leurs valeurs), donc je ne suis pas sûr que vous le pouvez. Que voulez-vous dire par une "activité Xaml" - pouvez-vous poster un exemple? –

+0

@dan vous pouvez réellement; l'exemple fourni aura deux propriétés In et Out dans le workflow une fois compilé. – Will

Répondre

3

devrait être quelque chose comme:

<x:Property.Attributes> 
    <sc:CategoryAttribute xmlns:sc="clr-namespace:System.ComponentModel;assembly=System"> 
     <x:Arguments><!-- x:Arguments is the Xaml way of constructing objects which require constructor arguments --> 
      <x:String>Input</x:String> 
     </x:Arguments> 
    </sc:CategoryAttribute> 
</x:Property.Attributes> 

(x: Arguments voir http://msdn.microsoft.com/en-us/library/ee795382.aspx

Je ne pense pas CategoryAttribute a TypeConverter pour une représentation plus compacte, bien que je peux me tromper ...)

+1

Vous avez presque raison, ce que vous voulez est: <- x: arguments est le moyen Xaml de construire des objets qui nécessitent des arguments du constructeur -> entrée Juste nécessaire pour fermer quelques balises et obtenir le bon espace de nom pour la catégorie. Aussi vous n'avez pas besoin des guillemets doubles dans la valeur :) –

+0

Merci John! Actualisé. –

1

Vous pouvez ajouter attributs dans XAML en utilisant la syntaxe. Voir les docs MSDN.

+1

Je souhaite que cela a été pris en charge pour tous les compilateurs xaml (comme wpf!) – Will

1

Si cela aide quelqu'un d'autre j'ai fini par écrire un automaticPropertyCategorizer pour donner à toutes les activités une catégorie:

public class AutomaticPropertyCategorizer : IRegisterMetadata 
{ 
    public void Register() 
    { 
     AttributeTableBuilder builder = new AttributeTableBuilder(); 

     foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies(). 
      Where(a => !a.FullName.StartsWith("System"))) 
     { 
      var activityTypes = from t in assembly.GetTypes() 
           where t.IsSubclassOf(typeof(Activity)) 
           select t; 
      foreach (Type t in activityTypes) 
      { 
       foreach (PropertyDescriptor pd in properties) 
       { 
        if (pd.PropertyType.IsSubclassOf(typeof(InArgument))) 
        { 
         tableBuilder.AddCustomAttributes(activityType, pd.Name, new CategoryAttribute("Input")); 
        } 
        else if (pd.PropertyType.IsSubclassOf(typeof(OutArgument))) 
        { 
         tableBuilder.AddCustomAttributes(activityType, pd.Name, new CategoryAttribute("Output")); 
        } 
        else if (pd.PropertyType.IsSubclassOf(typeof(InOutArgument))) 
        { 
         tableBuilder.AddCustomAttributes(activityType, pd.Name, new CategoryAttribute("Input/Output")); 
        } 
       } 
      } 
     } 

     AttributeTable attributes = builder.CreateTable(); 

     MetadataStore.AddAttributeTable(attributes); 
    } 
}