Категоризация свойств действий XAML - PullRequest
4 голосов
/ 12 июля 2010

Используя действие кода (то есть действие, построенное из C #), мы можем добавить атрибуты категории к нашим свойствам и красиво отобразить их в сетке свойств дизайнера рабочего процесса, например,

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

Возможна ли такая же функциональностьв операции XAML?

Редактировать: Включенный пример XAML: я хотел бы добавить [Category ("Input")] в In и [Category ("Output")] в Out в следующем 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>

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

Должно быть что-то вроде:

<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: аргументы см. http://msdn.microsoft.com/en-us/library/ee795382.aspx

Не думаю, что CategoryAttribute имеет TypeConverter для более компактного представления, хотя я могу ошибаться ...)

1 голос
/ 16 июля 2010

Если кому-то это поможет, я написал автоматическийPropertyCategorizer для присвоения категориям всех действий:

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);
    }
}
1 голос
/ 12 июля 2010

Вы можете добавить атрибуты в XAML, используя синтаксис. См. MSDN документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...