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=”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”>
    <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

    Comments (0)