使用代码活动(即由C#构建的活动),我们可以向我们的属性添加类别属性,并在工作流设计器的属性网格中很好地显示它们,例如。
[RequiredArgument]
[Category("Input")]
public InArgument<Guid> TermbaseId { get; set; }
XAML活动中是否可以使用相同的功能?
编辑:包含XAML示例:我想在下面的Xaml中将[Category(“Input”)]添加到In和[Category(“Output”)]到Out
<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 :(得分:3)
应该是这样的:
<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 :(得分:1)
您可以使用语法在XAML中添加属性。请参阅MSDN文档。
答案 2 :(得分:1)
如果它对其他人有帮助,我最后编写了一个automaticPropertyCategorizer来为所有活动分类:
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);
}
}