1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------
6 namespace System.Activities.Presentation
9 using System.Activities;
10 using System.Activities.Presentation.View;
11 using System.ComponentModel;
14 using XamlDeferLoad = System.Windows.Markup.XamlDeferLoadAttribute;
16 [Designer(typeof(ErrorActivity.ErrorActivityView))]
17 internal class ErrorActivity : Activity
19 static readonly AttachableMemberIdentifier HasErrorActivitiesProperty =
20 new AttachableMemberIdentifier(typeof(ErrorActivity), "HasErrorActivities");
21 internal const string ErrorNodesProperty = "ErrorNodes";
24 [XamlDeferLoad(typeof(NodeListLoader), typeof(object))]
25 public XamlNodeList ErrorNodes { get; set; }
27 internal static bool GetHasErrorActivities(object target)
30 if (AttachablePropertyServices.TryGetProperty(target, HasErrorActivitiesProperty, out result))
37 internal static void SetHasErrorActivities(object target, bool value)
39 AttachablePropertyServices.SetProperty(target, HasErrorActivitiesProperty, value);
42 internal static void WriteNodeList(XamlWriter writer, XamlNodeList nodeList)
44 // We need to pass the ErrorNodes contents through as a NodeList, because XOW doesn't
45 // currently support unknown types, even inside a DeferLoad block.
46 // But if a NodeList is written to XOW as a Value, XOW will unpack, forcing us to re-buffer
47 // the nodes in our deferring loader. So we wrap the NodeList value inside a dummy StartObject.
48 writer.WriteStartObject(XamlLanguage.Object);
49 writer.WriteStartMember(XamlLanguage.Initialization);
50 writer.WriteValue(nodeList);
51 writer.WriteEndMember();
52 writer.WriteEndObject();
55 internal class NodeListLoader : XamlDeferringLoader
57 public override object Load(XamlReader xamlReader, IServiceProvider serviceProvider)
59 // Expects a nodestream produced by WriteNodesList
63 Fx.Assert(xamlReader.NodeType == XamlNodeType.Value, "Expected Value node");
64 return (XamlNodeList)xamlReader.Value;
67 public override XamlReader Save(object value, IServiceProvider serviceProvider)
69 return ((XamlNodeList)value).GetReader();
73 internal class ErrorActivityView : WorkflowViewElement
75 public ErrorActivityView()
77 WorkflowViewService.ShowErrorInViewElement(this, SR.ActivityLoadError, null);
82 [Designer(typeof(ErrorActivity.ErrorActivityView))]
83 internal class ErrorActivity<T> : Activity<T>
86 [XamlDeferLoad(typeof(ErrorActivity.NodeListLoader), typeof(object))]
87 public XamlNodeList ErrorNodes { get; set; }