Inspection, Default Services and Items (WF4 EditingContext Intro Part 6)

This part 6 of my 6  part series on the EditingContext.

Introduction

Sharing Functionality between Designers 

Host provided capabilities  

Providing callbacks for the host 

Subscription/Notification engine

Inspection, Default Services and Items (you are here)

I want to wrap up this series of posts by posting some code for an activity designer that functions more as a diagnostic tool, and will display all of the Items and services of the EditingContext within the designer.  This will be useful from an investigation perspective, and hopefully as a diagnostic tool.  We will use this to help us understand what are the services that are available out of the box in VS, as well as in a rehosted application. 

We first need to create an empty activity to attach a designer to.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.ComponentModel;

namespace blogEditingContext
{
    [Designer(typeof(DiagnosticDesigner))]
    public sealed class Diagnosticator : CodeActivity
    {
        // Define an activity input argument of type string
        public InArgument<string> Text { get; set; }

        // If your activity returns a value, derive from CodeActivity<TResult>
        // and return the value from the Execute method.
        protected override void Execute(CodeActivityContext context)
        {
            // Obtain the runtime value of the Text input argument
            string text = context.GetValue(this.Text);
        }
    }
}

Now, let’s create our designer.  We could do fancy treeviews or object browser style UI’s, but as this is a blog post, I want to provide you with the basics, and then let you figure out how that is most useful to you.  So, we will just create a designer that writes out to debug output the relevant information. 

 <sap:ActivityDesigner x:Class="blogEditingContext.DiagnosticDesigner"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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">
  <Grid>
        <Button Click="Button_Click">Debug.WriteLine Context Data</Button>
    </Grid>
</sap:ActivityDesigner>

And now the code

 using System.Diagnostics;
using System.Linq;
using System.Windows;

namespace blogEditingContext
{
    // Interaction logic for DiagnosticDesigner.xaml
    public partial class DiagnosticDesigner
    {
        public DiagnosticDesigner()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // the goal here is to output meaningful and useful information about 
            // the contents of the editing context here. 
            int level = Debug.IndentLevel;
            Debug.WriteLine("Items in the EditingContext");
            Debug.IndentLevel++;
            foreach (var item in Context.Items.OrderBy(x => x.ItemType.ToString()))
            {
                Debug.WriteLine(item.ItemType);
            }

            Debug.IndentLevel = level;
            Debug.WriteLine("Services in the EditingContext");
            foreach (var service in Context.Services.OrderBy(x => x.ToString()))
            {
                Debug.WriteLine(service);
            }
        }
    }
}

Let’s break this down.  The work here happens in the button click where we simply order by types’ string representations and output them to the debug writer (a more robust implementation might use a trace writer that could be configured in the app, but for this purpose, this will be sufficient.

So, what output do we get?

VS Standard Services and Items

We determine this by using the activity in a freshly opened WF project

Items

 

System.Activities.Presentation.Hosting.AssemblyContextControlItem
System.Activities.Presentation.Hosting.ReadOnlyState
System.Activities.Presentation.Hosting.WorkflowCommandExtensionItem
System.Activities.Presentation.View.Selection
System.Activities.Presentation.WorkflowFileItem

Services

System.Activities.Presentation.Debug.IDesignerDebugView
System.Activities.Presentation.DesignerPerfEventProvider
System.Activities.Presentation.FeatureManager
System.Activities.Presentation.Hosting.ICommandService
System.Activities.Presentation.Hosting.IMultiTargetingSupportService
System.Activities.Presentation.Hosting.WindowHelperService
System.Activities.Presentation.IActivityToolboxService
System.Activities.Presentation.IIntegratedHelpService
System.Activities.Presentation.IWorkflowDesignerStorageService
System.Activities.Presentation.IXamlLoadErrorService
System.Activities.Presentation.Model.AttachedPropertiesService
System.Activities.Presentation.Model.ModelTreeManager
System.Activities.Presentation.Services.ModelService
System.Activities.Presentation.Services.ViewService
System.Activities.Presentation.UndoEngine
System.Activities.Presentation.Validation.IValidationErrorService
System.Activities.Presentation.Validation.ValidationService
System.Activities.Presentation.View.ActivityTypeDesigner+DisplayNameUpdater
System.Activities.Presentation.View.DesignerView
System.Activities.Presentation.View.IExpressionEditorService
System.Activities.Presentation.View.ViewStateService
System.Activities.Presentation.View.VirtualizedContainerService

 

Basic Rehosted Application Standard Services and Items

Items

System.Activities.Presentation.Hosting.ReadOnlyState
System.Activities.Presentation.Hosting.WorkflowCommandExtensionItem
System.Activities.Presentation.View.Selection

Services

System.Activities.Presentation.DesignerPerfEventProvider
System.Activities.Presentation.FeatureManager
System.Activities.Presentation.Hosting.WindowHelperService
System.Activities.Presentation.Model.AttachedPropertiesService
System.Activities.Presentation.Model.ModelTreeManager
System.Activities.Presentation.Services.ModelService
System.Activities.Presentation.Services.ViewService
System.Activities.Presentation.UndoEngine
System.Activities.Presentation.Validation.ValidationService
System.Activities.Presentation.View.DesignerView
System.Activities.Presentation.View.ViewStateService
System.Activities.Presentation.View.VirtualizedContainerService

Comparison Table View

Items VS Rehosted

System.Activities.Presentation.Hosting.AssemblyContextControlItem 

Yes

No

System.Activities.Presentation.Hosting.ReadOnlyState 

Yes

Yes

System.Activities.Presentation.Hosting.WorkflowCommandExtensionItem 

Yes

Yes

System.Activities.Presentation.View.Selection 

Yes

Yes

System.Activities.Presentation.WorkflowFileItem 

Yes

No

Services VS Rehosted 

System.Activities.Presentation.Debug.IDesignerDebugView 

Yes

No

System.Activities.Presentation.DesignerPerfEventProvider 

Yes

Yes

System.Activities.Presentation.FeatureManager 

Yes

Yes

System.Activities.Presentation.Hosting.ICommandService 

Yes

No

System.Activities.Presentation.Hosting.IMultiTargetingSupportService 

Yes

No

System.Activities.Presentation.Hosting.WindowHelperService 

Yes

Yes

System.Activities.Presentation.IActivityToolboxService 

Yes

No

System.Activities.Presentation.IIntegratedHelpService 

Yes

No

System.Activities.Presentation.IWorkflowDesignerStorageService 

Yes

No

System.Activities.Presentation.IXamlLoadErrorService 

Yes

No

System.Activities.Presentation.Model.AttachedPropertiesService 

Yes

Yes

System.Activities.Presentation.Model.ModelTreeManager 

Yes

Yes

System.Activities.Presentation.Services.ModelService 

Yes

Yes

System.Activities.Presentation.Services.ViewService 

Yes

Yes

System.Activities.Presentation.UndoEngine 

Yes

Yes

System.Activities.Presentation.Validation.IValidationErrorService 

Yes

No

System.Activities.Presentation.Validation.ValidationService 

Yes

Yes

System.Activities.Presentation.View.ActivityTypeDesigner+DisplayNameUpdater 

Yes

No

System.Activities.Presentation.View.DesignerView 

Yes

Yes

System.Activities.Presentation.View.IExpressionEditorService 

Yes

No

System.Activities.Presentation.View.ViewStateService 

Yes

Yes

System.Activities.Presentation.View.VirtualizedContainerService 

Yes

Yes

 

 

 

 

Conclusion

This wraps up our series on the editing context.  We’ve gone through the basics of why we need it, what we can do with it, and then we moved how to use it, from both the very simple to the very complex.  We’ve finished with a diagnostic tool to help understand what all items I can bind to.

What’s Next From Here?

A few ideas for the readers who have read all of these:

  • Wire up a few attached properties to reflect back through to some interesting data (like if it is selected).  These attached properties could then be used directly by your UI (via the binding in XAML) to let your designers display and react to changes in the data
  • Think about ideas for services you might want to add in VS without depending on an activity to inject it (and send me mail, I am trying to compile a list of interesting things)
  • Are there service/item implementations you want to override in VS?
  • Is there a service/item you expect to see that is not there?

Thanks for now!

 

 

 

blogEditingContext.zip