0

カスタム アクティビティが定義されたソリューションがあり、それに合わせてデザイナーを作成しました (以下を参照)。私は 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());
        }
    }
}
4

1 に答える 1

2

私はそれを理解しました... デザイン プロジェクトでその DLL をアクティビティ プロジェクトにコピーする必要があるため、MSBuild ポスト ビルド イベントを作成して、デザイン ライブラリをアクティビティのデバッグ フォルダーにコピーしました。今VSはそれを拾います。

于 2013-02-28T21:39:13.433 に答える