2

再ホストされたデザイナー (WF4) からの結果には、引数に既定値を追加するときに問題があります。他のすべてのケースはうまくいくようです。これは、(ほぼ) 空のワークフローの (要約された) xaml です。

<Activity mc:Ignorable="sap" x:Class="{x:Null}" this:_b40c.NewArg="test" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" 
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" 
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:this="clr-namespace:" xmlns:twc="clr-namespace:Telogis.Workflow.CustomerApi;assembly=Telogis.Workflow.Activities" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="AuthenticationHeader" Type="InArgument(twc:AuthenticationHeader)" />
    <x:Property Name="BaseTdeUri" Type="InArgument(x:Uri)" />
    <x:Property Name="NewArg" Type="InArgument(x:String)" />
  </x:Members>
  <sap:VirtualizedContainerService.HintSize>654,676</sap:VirtualizedContainerService.HintSize>
  <mva:VisualBasic.Settings>Assembly references and imported namespaces serialized as XML namespaces</mva:VisualBasic.Settings>
  <Flowchart />
</Activity>

this:_b40c.NewArg="test"具体的には、既定値が追加されると、定義に次の追加が行われます:xmlns:this="clr-namespace:" xmlns:this="clr-namespace:"どこも指しておらず、解析できないため無効ですActivityXamlServices.Load(stream);(XamlObjectWriterException をスローします: "'Cannot set unknown member '{clr-namespace: }_b40c.NewArg'.' ...) これは、指定された引数の型が何であれ発生するようです。

何がこれを引き起こしているのでしょうか?

アップデート

ActivityBuilderそもそもアクティビティを利用するために を使用していました。これは問題ありませんでしたが、名前を付けていなかったため、上記の例ではキーを生成する必要がありました_b40cActivityXamlServices.Loadこれらのキーの処理に何らかの問題があります。ただし、名前を定義するだけでActivityBuilderうまくいくようです。

xmlns:this="clr-namespace:"これは、実際の名前空間なしで作成する理由にはまだ答えていません。

4

2 に答える 2

0

私がよく理解していれば、これはWF Designerのバグです。InArgument<T>カスタム WF デザイナーで既定値の定義をサポートする必要があったときに、この問題に直面しました。この基本的な手順がサポートされていないことにまだ驚いています。

失敗の理由は 2 つあります。

  1. {x:Null}inx:Class属性の定義
  2. xmlns:this属性の定義が無効です
  3. そして主な問題は、Argument のデフォルト値 this:_effe.MyArgument="asd" の無効な定義です。引数のデフォルト値の定義は、MyXamlClassName.MyArgument="asd" と等しくなければなりません。たとえば、x:Cass 定義が x:Class="MyNamespace.MyClass" の場合、引数の定義は次のようにする必要があります:MyClass.MyArgument="asd"。

XAML保存プロセスに介入することで解決しました:の呼び出し後 _workflowDesigner.Save(_editedFile);

次の 2 行を追加しました。

     #region x:Class and Argument<T> default value issues solution

            await CreateAttributeValue(_editedFile, ConstXClassAttributeName, typeof(App).Namespace + "." + Path.GetFileNameWithoutExtension(_editedFile));
            //should finish first operation before second operation begins to avoid I/O exception
            await CreateAttributeValue(_editedFile, ConstNamespaceAttributeName, ConstXamlClrNamespace + typeof(App).Namespace);
            await RepairArgsAttributes(_editedFile);
                #endregion

This is the methods definition:


  /// <summary>
    /// Reason of using of this method: bug in workflow designer. When you save your xaml file, WF Designer assign "{x:Null}" to x:Class attribute
    /// Bug: In addition, if you want to set default value for your InArgument<T>, it defines attribute "this" (namespace declaration) with empty value. When you try to open your file, designer fails to parse XAML.
    /// </summary>
    /// <param name="editedFile"></param>
    /// <param name="attribteName"></param>
    /// <param name="attributeValueToReplace"></param>
    private static async Task CreateAttributeValue(string editedFile, string attribteName, string attributeValueToReplace)
    {
        XmlDocument xmlDoc = new XmlDocument();
        await Task.Run(() => xmlDoc.Load(editedFile));

        await Task.Run(() =>
        {
            var attributteToReplace = xmlDoc.FirstChild.Attributes?[attribteName];

            if (null != attributteToReplace)
            {
                xmlDoc.FirstChild.Attributes[attribteName].Value = attributeValueToReplace;
                xmlDoc.Save(editedFile);
            }
        });
    }

 /// <summary>
        /// Bug in Workflow designer: workflow designer saves declaration for In/Out Arguments in invalid format. Means, that it is unable to open the same file it saved itself. This method fixes the Arguments declaration in XAML xmlns
        /// </summary>
        /// <param name="editedFile"></param>
        /// <returns></returns>
        private async Task RepairArgsAttributes(string editedFile)
        {
            XmlDocument xmlDoc = new XmlDocument();
            await Task.Run(() => xmlDoc.Load(editedFile));

            await Task.Run(() =>
            {
                for (int i = 0; i < xmlDoc.FirstChild.Attributes.Count; i++)
                {
                    if (xmlDoc.FirstChild.Attributes[i].Name.StartsWith(ConstInvalidArgStarts))
                    {
                        string innvalidAttrName = xmlDoc.FirstChild.Attributes[i].Name;//extraction of full argument declaration in xmlns
                        string[] oldStrings = innvalidAttrName.Split('.');//extraction of arguemnt name string
                        string localName = Path.GetFileNameWithoutExtension(editedFile) + "." + oldStrings[1];//build valid argment declaration without perfix
                        string valueBackup = xmlDoc.FirstChild.Attributes[i].Value;//saving of default value of Arguemnt<T>
                        xmlDoc.FirstChild.Attributes.RemoveNamedItem(xmlDoc.FirstChild.Attributes[i].Name);//removal of invalid Arguemnt declaration with default value. WARNING: when you remove attribue, at this moment you have another item at the place xmlDoc.FirstChild.Attributes[i]
                        //definition of new valid attribute requries: set separelly attribute prefix, localName (not "name" - it causes invalid attribute definition) and valid namespace url (in our case it's namespace deifinition in "this")
                        XmlAttribute attr = xmlDoc.CreateAttribute(ConstArgPrefix, localName, xmlDoc.FirstChild.Attributes[ConstNamespaceAttributeName].Value);
                        attr.Value = valueBackup;
                        xmlDoc.FirstChild.Attributes.InsertBefore(attr, xmlDoc.FirstChild.Attributes[i]);//define new correct Argument declaration attribute at the same place where was invalid attribute. When you put valid attribute at the same place your recover valid order of attributes that was changed while removal of invalid attribute declaration
                    }
                }
                xmlDoc.Save(editedFile);

            });
        }

定数の定義は次のとおりです。

 #region Constants
    private const string ConstXClassAttributeName = "x:Class";
    private const string ConstXamlClrNamespace = "clr-namespace:";
    private const string ConstNamespaceAttributeName = "xmlns:this";
    private const string ConstInvalidArgStarts = @"this:_";
    private const string ConstArgPrefix = @"this";

    #endregion

このソリューションは、問題も解決するはずです。

于 2016-03-29T15:39:39.423 に答える
0

ワークフロー xaml が無効です。どこで手に入れたのか、どのようにしてこの状態になったのかわかりません。

私はこれを伝えることができます

<Activity 
    x:Class="{x:Null}" 
    this:_b40c.NewArg="test"
    xmlns:this="clr-namespace:" 

clr スタイルの名前空間宣言が無効です。それは読むべきです

clr-namespace:Some.Namespace.In.The.Current.Assembly

また

clr-namespace:Some.Namespace;assembly=SomeAssemblyWithSomeNamespace

宣言の形式が正しくないため、型が存在する名前空間/アセンブリを特定するために、このxml 名前空間を XamlObjectWriter で解析できません_b40c。また、これも非常に疑わしいようです。x:Classそして、以前に null に設定されているのを見たことがありません。それはまた、私を奇形だと思います。

于 2012-08-09T17:38:09.447 に答える