自訂活動設計器外觀有兩種方式:硬編碼 [Designer] 屬性與獨立專案註冊 Metadata。後者為微軟內建活動採用方式,靈活度更高。
[Designer(typeof(CustomWriteLineDesigner))]
public sealed class CustomWriteLine : CodeActivity
{
[RequiredArgument] public InArgument<string> Text { get; set; }
protected override void Execute(CodeActivityContext context)
=> Console.WriteLine(context.GetValue(this.Text));
}
或用字串指定組件限定名稱:
[Designer("MyActivityDesigner.CustomWriteLineDesigner,MyActivityDesigner")]
設計器 XAML (CustomWriteLineDesigner.xaml) 定義圖示、表達式編輯框佈局:
<sap:ActivityDesigner ...>
<sap:ActivityDesigner.Icon>
<DrawingBrush><ImageDrawing ImageSource="WriteLine.jpg" /></DrawingBrush>
</sap:ActivityDesigner.Icon>
<Grid>
<TextBlock Text="Text " />
<sapv:ExpressionTextBox Expression="{Binding Path=ModelItem.Text, ...}" />
</Grid>
</sap:ActivityDesigner>


public sealed class CustomWriteLine : CodeActivity
{
[RequiredArgument] public InArgument<string> Text { get; set; }
protected override void Execute(CodeActivityContext context)
=> Console.WriteLine(context.GetValue(this.Text));
}
public class DesignerMetadata : IRegisterMetadata
{
public void Register()
{
var builder = new AttributeTableBuilder();
builder.AddCustomAttributes(typeof(CustomWriteLine),
new DesignerAttribute(typeof(CustomWriteLineDesigner)));
MetadataStore.AddAttributeTable(builder.CreateTable());
}
}
將設計器專案 建置輸出路徑 設為邏輯層專案 bin\Debug 同目錄,兩 DLL 共存即自動關聯:

自訂活動寬度自適應內容,完整顯示長文字屬性;內建活動會截斷。設計器上更直觀,適合面向業務用戶的流程建模:

方式一簡單直接,方式二關注點分離、利於團隊協作與複用,符合微軟最佳實踐。自訂外觀讓設計器更直觀,是將工作流交付給非技術人員使用的關鍵。