カスタム アクティビティが定義されたソリューションがあり、それに合わせてデザイナーを作成しました (以下を参照)。私は 3 つのプロジェクトを持っています。1 つはカスタム アクティビティ用、もう 1 つはカスタム アクティビティのデザイナー用、もう 1 つはカスタム アクティビティ (単純なコンソール アプリケーション) を実際に実行するためのものです。
カスタム アクティビティを使用する複合アクティビティを作成すると、VS のデザイナーはカスタム デザイナーを使用しません。デザイナー アセンブリが *.Design.dll という名前で命名され、コンソール アプリケーションの bin ディレクトリにコピーされていることを確認しましたが、カスタム デザイナーが選択されない理由がわかりません。何か案は?以下は、必要なすべての部分のコードです。
マイ カスタム アクティビティ
namespace WorkflowSampler.Activities
{
using System.Activities;
using System.Diagnostics;
public class SampleVarChanger : NativeActivity
{
private InArgument<int> expressionToEvaluate;
private Variable<int> counter;
public Variable<int> Counter
{
get
{
return this.counter ?? (this.counter = new Variable<int>());
}
set
{
this.counter = value;
}
}
public InArgument<int> ExpressionToEvaluate
{
get
{
return this.expressionToEvaluate ?? (this.expressionToEvaluate = new InArgument<int>());
}
set
{
this.expressionToEvaluate = value;
}
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddImplementationVariable(this.Counter);
var exprToEvalRuntimeArg = new RuntimeArgument("ExpressionToEvaluate", typeof(int), ArgumentDirection.In);
metadata.Bind(this.ExpressionToEvaluate, exprToEvalRuntimeArg);
metadata.AddArgument(exprToEvalRuntimeArg);
}
protected override void Execute(NativeActivityContext context)
{
Debug.WriteLine(string.Format("Counter Variable Value: {0}", this.Counter.Get(context)));
}
}
}
マイ カスタム アクティビティのデザイナー (XAML 部分)
<sap:ActivityDesigner x:Class="WorkflowSampler.Activities.Design.SampleVarChangerDesigner"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"
xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation">
<sap:ActivityDesigner.Resources>
<ResourceDictionary>
<sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" />
</ResourceDictionary>
</sap:ActivityDesigner.Resources>
<Grid Margin="10, 0, 0, 0">
<Grid.RowDefinitions>
<RowDefinition Height="25" />
<RowDefinition Height="25" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBlock Text="Variable Name:" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" />
<TextBox Name="VariableName" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1" TextChanged="OnVariableNameChanged" />
<TextBlock Text="Expression Using Variable:" VerticalAlignment="Center" Grid.Row="1" Grid.Column="0" />
<sapv:ExpressionTextBox Name="ExpressionUsingVariable" VerticalContentAlignment="Center" Expression="{Binding Path=ModelItem.ExpressionToEvaluate, Converter={StaticResource ResourceKey=ArgumentToExpressionConverter}, ConverterParameter=In, Mode=TwoWay}" OwnerActivity="ModelItem" Grid.Row="1" Grid.Column="1" />
</Grid>
</sap:ActivityDesigner>
カスタム アクティビティのデザイナー (コード ビハインド パーツ)
namespace WorkflowSampler.Activities.Design
{
using System.Activities;
// Interaction logic for SampleVarChangerDesigner.xaml
public partial class SampleVarChangerDesigner
{
public SampleVarChangerDesigner()
{
InitializeComponent();
}
private void OnVariableNameChanged(object sender, TextChangedEventArgs e)
{
this.ModelItem.Properties["Counter"].SetValue(new Variable<int>(this.VariableName.Text));
}
}
}
VS Designer のサポートに必要な IRegisterMetadata インターフェイス
namespace WorkflowSampler.Activities.Design
{
using System.Activities.Presentation.Metadata;
using System.ComponentModel;
/// <summary>
/// Registers the activity designer metadata.
/// </summary>
public class RegisterMetadata : IRegisterMetadata
{
public void Register()
{
AttributeTableBuilder builder = new AttributeTableBuilder();
builder.AddCustomAttributes(typeof(SampleVarChanger), new DesignerAttribute(typeof(SampleVarChangerDesigner)));
MetadataStore.AddAttributeTable(builder.CreateTable());
}
}
}