Dela via


Gör så här: Skapa en anpassad aktivitetsdesigner

Anpassade aktivitetsdesigners implementeras vanligtvis så att deras associerade aktiviteter kan kombineras med andra aktiviteter vars designers kan släppas på designytan med dem. Den här funktionen kräver att en anpassad aktivitetsdesigner tillhandahåller en "släppzon" där en godtycklig aktivitet kan placeras och även medel för att hantera den resulterande samlingen av element på designytan. Det här avsnittet beskriver hur du skapar en anpassad aktivitetsdesigner som innehåller en sådan släppzon och hur du skapar en anpassad aktivitetsdesigner som tillhandahåller den redigeringsfunktion som krävs för att hantera samlingen med designerelement.

Anpassade aktivitetsdesigners ärver vanligtvis från ActivityDesigner vilken som är standardtyp för basaktivitetsdesignern för alla aktiviteter utan en specifik designer. Den här typen ger designtidsupplevelsen när du interagerar med egenskapsrutnätet och konfigurerar grundläggande aspekter som att hantera färger och ikoner.

ActivityDesigner använder två hjälpkontroller WorkflowItemPresenter och WorkflowItemsPresenter för att göra det enklare att utveckla anpassade aktivitetsdesigners. De hanterar vanliga funktioner som att dra och släppa underordnade element, ta bort, välja och lägga till dessa underordnade element. WorkflowItemPresenter Tillåter ett enda underordnat gränssnittselement inuti, vilket ger "släppzonen", medan WorkflowItemsPresenter det kan ge stöd för flera gränssnittselement, inklusive ytterligare funktioner som beställning, flytt, borttagning och tillägg av underordnade element.

Den andra viktiga delen av artikeln som behöver markeras i implementeringen av en anpassad aktivitetsdesigner handlar om hur de visuella redigeringarna binds med wpf-databindning till den instans som lagras i minnet av det vi redigerar i designern. Detta görs av modellobjektträdet, som också ansvarar för att aktivera ändringsmeddelanden och spårning av händelser som ändringar i tillstånd.

Det här avsnittet beskriver två procedurer.

  1. Den första proceduren beskriver hur du skapar en anpassad aktivitetsdesigner med en WorkflowItemPresenter som tillhandahåller den släppzon som tar emot andra aktiviteter. Den här proceduren baseras på exemplet Custom Composite Designers – Workflow Item Presenter .

  2. Den andra proceduren beskriver hur du skapar en anpassad aktivitetsdesigner med en WorkflowItemsPresenter som tillhandahåller de funktioner som krävs för att redigera en samling inneslutna element. Den här proceduren baseras på exemplet Custom Composite Designers – Workflow Items Presenter .

Skapa en anpassad aktivitetsdesigner med en släppzon med Hjälp av WorkflowItemPresenter

  1. Starta Visual Studio 2010.

  2. På menyn Arkiv pekar du på Nytt och väljer sedan Projekt....

    Dialogrutan Nytt projekt öppnas.

  3. I fönstret Installerade mallar väljer du Windows från önskad språkkategori.

  4. I fönstret Mallar väljer du WPF-program.

  5. I rutan Namn anger du UsingWorkflowItemPresenter.

  6. I rutan Plats anger du den katalog där du vill spara projektet eller klickar på Bläddra för att navigera till det.

  7. Acceptera standardvärdet i rutan Lösning.

  8. Klicka på OK.

  9. Högerklicka på filen MainWindows.xaml i Solution Explorer, välj Ta bort och bekräfta OK i dialogrutan Microsoft Visual Studio .

  10. Högerklicka på projektet UsingWorkflowItemPresenter i Solution Explorer, välj Lägg till och sedan Nytt objekt... för att öppna dialogrutan Lägg till nytt objekt och välj WPF-kategorin i avsnittet Installerade mallar till vänster.

  11. Välj mallen Fönster (WPF), ge den RehostingWFDesignernamnet och klicka på Lägg till.

  12. Öppna filen RehostingWFDesigner.xaml och klistra in följande kod i den för att definiera användargränssnittet för programmet:

    <Window x:Class=" UsingWorkflowItemPresenter.RehostingWFDesigner"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:sapt="clr-namespace:System.Activities.Presentation.Toolbox;assembly=System.Activities.Presentation"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="Window1" Height="600" Width="900">
        <Window.Resources>
            <sys:String x:Key="AssemblyName">System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</sys:String>
        </Window.Resources>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*"/>
                <ColumnDefinition Width="7*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <Border Grid.Column="0">
                <sapt:ToolboxControl Name="Toolbox">
                    <sapt:ToolboxCategory CategoryName="Basic">
                        <sapt:ToolboxItemWrapper AssemblyName="{StaticResource AssemblyName}" >
                            <sapt:ToolboxItemWrapper.ToolName>
                                System.Activities.Statements.Sequence
                            </sapt:ToolboxItemWrapper.ToolName>
                           </sapt:ToolboxItemWrapper>
                        <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                            <sapt:ToolboxItemWrapper.ToolName>
                                System.Activities.Statements.WriteLine
                            </sapt:ToolboxItemWrapper.ToolName>
    
                        </sapt:ToolboxItemWrapper>
                        <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                            <sapt:ToolboxItemWrapper.ToolName>
                                System.Activities.Statements.If
                            </sapt:ToolboxItemWrapper.ToolName>
    
                        </sapt:ToolboxItemWrapper>
                        <sapt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">
                            <sapt:ToolboxItemWrapper.ToolName>
                                System.Activities.Statements.While
                            </sapt:ToolboxItemWrapper.ToolName>
    
                        </sapt:ToolboxItemWrapper>
                    </sapt:ToolboxCategory>
                </sapt:ToolboxControl>
            </Border>
            <Border Grid.Column="1" Name="DesignerBorder"/>
            <Border Grid.Column="2" Name="PropertyBorder"/>
        </Grid>
    </Window>
    
  13. Om du vill associera en aktivitetsdesigner med en aktivitetstyp måste du registrera den aktivitetsdesignern med metadatalagret. Det gör du genom RegisterMetadata att lägga till metoden i RehostingWFDesigner klassen. Inom metodens RegisterMetadata omfång skapar du ett AttributeTableBuilder objekt och anropar AddCustomAttributes metoden för att lägga till attributen i den. AddAttributeTable Anropa metoden för att lägga till i AttributeTable metadatalagret. Följande kod innehåller omvärdningslogik för designern. Den registrerar metadata, placerar SimpleNativeActivity i verktygslådan och skapar arbetsflödet. Placera den här koden i filen RehostingWFDesigner.xaml.cs .

    using System;
    using System.Activities.Core.Presentation;
    using System.Activities.Presentation;
    using System.Activities.Presentation.Metadata;
    using System.Activities.Presentation.Toolbox;
    using System.Activities.Statements;
    using System.ComponentModel;
    using System.Windows;
    
    namespace UsingWorkflowItemPresenter
    {
        // Interaction logic for RehostingWFDesigner.xaml
        public partial class RehostingWFDesigner
        {
            public RehostingWFDesigner()
            {
                InitializeComponent();
            }
    
            protected override void OnInitialized(EventArgs e)
            {
                base.OnInitialized(e);
                // Register metadata.
                (new DesignerMetadata()).Register();
                RegisterCustomMetadata();
                // Add custom activity to toolbox.
                Toolbox.Categories.Add(new ToolboxCategory("Custom activities"));
                Toolbox.Categories[1].Add(new ToolboxItemWrapper(typeof(SimpleNativeActivity)));
    
                // Create the workflow designer.
                var wd = new WorkflowDesigner();
                wd.Load(new Sequence());
                DesignerBorder.Child = wd.View;
                PropertyBorder.Child = wd.PropertyInspectorView;
    
            }
    
            void RegisterCustomMetadata()
            {
                var builder = new AttributeTableBuilder();
                builder.AddCustomAttributes(typeof(SimpleNativeActivity), new DesignerAttribute(typeof(SimpleNativeDesigner)));
                MetadataStore.AddAttributeTable(builder.CreateTable());
            }
        }
    }
    
  14. Högerklicka på katalogen Referenser i Solution Explorer och välj Lägg till referens ... för att öppna dialogrutan Lägg till referens .

  15. Klicka på fliken .NET, leta upp sammansättningen med namnet System.Activities.Core.Presentation, välj den och klicka på OK.

  16. Med samma procedur lägger du till referenser till följande sammansättningar:

    1. System.Data.DataSetExtensions.dll

    2. System.Activities.Presentation.dll

    3. System.ServiceModel.Activities.dll

  17. Öppna filen App.xaml och ändra värdet för StartUpUri till "RehostingWFDesigner.xaml".

  18. Högerklicka på projektet UsingWorkflowItemPresenter i Solution Explorer, välj Lägg till och sedan Nytt objekt... för att öppna dialogrutan Lägg till nytt objekt och välj kategorin Arbetsflöde i avsnittet Installerade mallar till vänster.

  19. Välj mallen Aktivitetsdesigner , ge den SimpleNativeDesignernamnet och klicka på Lägg till.

  20. Öppna filen SimpleNativeDesigner.xaml och klistra in följande kod i den. Observera att den här koden använder ActivityDesigner som rotelement och visar hur bindning används för att integrera WorkflowItemPresenter i designern så att en underordnad typ kan visas i den sammansatta aktivitetsdesignern.

    Kommentar

    Schemat för ActivityDesigner tillåter att endast ett underordnat element läggs till i definitionen för den anpassade aktivitetsdesignern. Det här elementet kan dock vara ett StackPanel, Grideller något annat sammansatt gränssnittselement.

    <sap:ActivityDesigner x:Class=" UsingWorkflowItemPresenter.SimpleNativeDesigner"
        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">
        <sap:ActivityDesigner.Resources>
            <DataTemplate x:Key="Collapsed">
                <StackPanel>
                    <TextBlock>This is the collapsed view</TextBlock>
                </StackPanel>
            </DataTemplate>
            <DataTemplate x:Key="Expanded">
                <StackPanel>
                    <TextBlock>Custom Text</TextBlock>
                    <sap:WorkflowItemPresenter Item="{Binding Path=ModelItem.Body, Mode=TwoWay}"
                                            HintText="Please drop an activity here" />
                </StackPanel>
            </DataTemplate>
            <Style x:Key="ExpandOrCollapsedStyle" TargetType="{x:Type ContentPresenter}">
                <Setter Property="ContentTemplate" Value="{DynamicResource Collapsed}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=ShowExpanded}" Value="true">
                        <Setter Property="ContentTemplate" Value="{DynamicResource Expanded}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </sap:ActivityDesigner.Resources>
        <Grid>
            <ContentPresenter Style="{DynamicResource ExpandOrCollapsedStyle}" Content="{Binding}" />
        </Grid>
    </sap:ActivityDesigner>
    
  21. Högerklicka på projektet UsingWorkflowItemPresenter i Solution Explorer, välj Lägg till och sedan Nytt objekt... för att öppna dialogrutan Lägg till nytt objekt och välj kategorin Arbetsflöde i avsnittet Installerade mallar till vänster.

  22. Välj mallen Kodaktivitet , ge den SimpleNativeActivitynamnet och klicka på Lägg till.

  23. SimpleNativeActivity Implementera klassen genom att ange följande kod i SimpleNativeActivity.cs-filen:

    using System.Activities;
    
    namespace UsingWorkflowItemPresenter
    {
        public sealed class SimpleNativeActivity : NativeActivity
        {
            // this property contains an activity that will be scheduled in the execute method
            // the WorkflowItemPresenter in the designer is bound to this to enable editing
            // of the value
            public Activity Body { get; set; }
    
            protected override void CacheMetadata(NativeActivityMetadata metadata)
            {
               metadata.AddChild(Body);
               base.CacheMetadata(metadata);
    
            }
    
            protected override void Execute(NativeActivityContext context)
            {
                context.ScheduleActivity(Body);
            }
        }
    }
    
  24. Välj Skapa lösningmenyn Skapa .

  25. Välj Starta utan att felsöka från felsökningsmenyn för att öppna det omvärdade anpassade designfönstret.

Skapa en anpassad aktivitetsdesigner med Hjälp av WorkflowItemsPresenter

  1. Proceduren för den andra anpassade aktivitetsdesignern är parallellerna den första med några ändringar, varav den första är att namnge det andra programmet UsingWorkflowItemsPresenter. Det här programmet definierar inte heller någon ny anpassad aktivitet.

  2. Viktiga skillnader finns i Filerna CustomParallelDesigner.xaml och RehostingWFDesigner.xaml.cs . Här är koden från filen CustomParallelDesigner.xaml som definierar användargränssnittet:

    <sap:ActivityDesigner x:Class=" UsingWorkflowItemsPresenter.CustomParallelDesigner"
        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">
        <sap:ActivityDesigner.Resources>
            <DataTemplate x:Key="Collapsed">
                <TextBlock>This is the Collapsed View</TextBlock>
            </DataTemplate>
            <DataTemplate x:Key="Expanded">
                <StackPanel>
                    <TextBlock HorizontalAlignment="Center">This is the</TextBlock>
                    <TextBlock HorizontalAlignment="Center">extended view</TextBlock>
                    <sap:WorkflowItemsPresenter HintText="Drop Activities Here"
                                        Items="{Binding Path=ModelItem.Branches}">
                        <sap:WorkflowItemsPresenter.SpacerTemplate>
                            <DataTemplate>
                                <Ellipse Width="10" Height="10" Fill="Black"/>
                            </DataTemplate>
                        </sap:WorkflowItemsPresenter.SpacerTemplate>
                        <sap:WorkflowItemsPresenter.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </sap:WorkflowItemsPresenter.ItemsPanel>
                    </sap:WorkflowItemsPresenter>
                </StackPanel>
            </DataTemplate>
            <Style x:Key="ExpandOrCollapsedStyle" TargetType="{x:Type ContentPresenter}">
                <Setter Property="ContentTemplate" Value="{DynamicResource Collapsed}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=ShowExpanded}" Value="true">
                        <Setter Property="ContentTemplate" Value="{DynamicResource Expanded}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </sap:ActivityDesigner.Resources>
        <Grid>
            <ContentPresenter Style="{DynamicResource ExpandOrCollapsedStyle}" Content="{Binding}"/>
        </Grid>
    </sap:ActivityDesigner>
    
  3. Här är koden från filen RehostingWFDesigner.xaml.cs som tillhandahåller omvärdningslogik:

    using System;
    using System.Activities.Core.Presentation;
    using System.Activities.Presentation;
    using System.Activities.Presentation.Metadata;
    using System.Activities.Statements;
    using System.ComponentModel;
    using System.Windows;
    
    namespaceUsingWorkflowItemsPresenter
    {
        public partial class RehostingWfDesigner : Window
        {
            public RehostingWfDesigner()
            {
                InitializeComponent();
            }
    
            protected override void OnInitialized(EventArgs e)
            {
                base.OnInitialized(e);
                // Register metadata.
                (new DesignerMetadata()).Register();
                RegisterCustomMetadata();
    
                // Create the workflow designer.
                var wd = new WorkflowDesigner();
                wd.Load(new Sequence());
                DesignerBorder.Child = wd.View;
                PropertyBorder.Child = wd.PropertyInspectorView;
    
            }
    
            void RegisterCustomMetadata()
            {
                var builder = new AttributeTableBuilder();
                builder.AddCustomAttributes(typeof(Parallel), new DesignerAttribute(typeof(CustomParallelDesigner)));
                MetadataStore.AddAttributeTable(builder.CreateTable());
            }
        }
    }
    

Se även