Sdílet prostřednictvím


Postupy: Vytvoření vlastního návrháře aktivity

Návrháři vlastních aktivit se obvykle implementují tak, aby jejich přidružené aktivity byly kompozibilní s dalšími aktivitami, jejichž návrháři se dají spouštět na návrhovou plochu s nimi. Tato funkce vyžaduje, aby vlastní návrhář aktivity poskytoval "zónu přetažení", kde lze libovolnou aktivitu umístit, a také prostředky pro správu výsledné kolekce prvků na návrhové ploše. Toto téma popisuje, jak vytvořit vlastní návrhář aktivity, který obsahuje takovou zónu přetažení a jak vytvořit vlastní návrhář aktivity, který poskytuje funkce pro úpravy potřebné ke správě kolekce prvků návrháře.

Návrháři vlastních aktivit obvykle dědí, z ActivityDesigner něhož je výchozí typ návrháře základní aktivity pro všechny aktivity bez konkrétního návrháře. Tento typ poskytuje možnosti návrhu práce s mřížkou vlastností a konfigurací základních aspektů, jako je správa barev a ikon.

ActivityDesigner používá dva pomocné ovládací prvky a WorkflowItemPresenterWorkflowItemsPresenter usnadňuje vývoj vlastních návrhářů aktivit. Zpracovávají běžné funkce, jako je přetažení podřízených prvků, odstranění, výběr a přidání těchto podřízených prvků. Umožňuje WorkflowItemPresenter uvnitř jediného podřízeného prvku uživatelského rozhraní, který poskytuje "zónu přetažení", zatímco WorkflowItemsPresenter může poskytovat podporu více prvků uživatelského rozhraní, včetně dalších funkcí, jako je řazení, přesouvání, odstraňování a přidávání podřízených prvků.

Další klíčovou částí příběhu, která vyžaduje zvýraznění při implementaci vlastního návrháře aktivit, se týká způsobu, jakým jsou úpravy vizuálu vázány pomocí datové vazby WPF na instanci uloženou v paměti toho, co v návrháři upravujeme. Toho se dosahuje stromem položky modelu, který je také zodpovědný za povolení oznámení o změnách a sledování událostí, jako jsou změny ve stavech.

Toto téma popisuje dva postupy.

  1. První postup popisuje, jak vytvořit vlastního návrháře aktivit pomocí WorkflowItemPresenter zóny pro odstraňování, která přijímá další aktivity. Tento postup vychází z ukázky vlastního složeného návrháře – prezentující položky pracovního postupu.

  2. Druhý postup popisuje, jak vytvořit vlastní návrhář aktivity s WorkflowItemsPresenter funkcí potřebnou k úpravě kolekce obsažených prvků. Tento postup vychází z ukázky vlastního složeného návrháře – položky pracovního postupu prezentujícího .

Vytvoření vlastního návrháře aktivit s zónou přetažení pomocí WorkflowItemPresenter

  1. Spusťte Visual Studio 2010.

  2. V nabídce Soubor přejděte na příkaz Nový a pak vyberte Projekt....

    Otevře se dialogové okno Nový projekt .

  3. V podokně Nainstalované šablony vyberte Windows z preferované jazykové kategorie.

  4. V podokně Šablony vyberte aplikaci WPF.

  5. Do pole Název zadejte UsingWorkflowItemPresenter.

  6. Do pole Umístění zadejte adresář, do kterého chcete projekt uložit, nebo klikněte na Procházet a přejděte na něj.

  7. V poli Řešení přijměte výchozí hodnotu.

  8. Klikněte na OK.

  9. Klikněte pravým tlačítkem myši na soubor MainWindows.xaml v Průzkumník řešení, v dialogovém okně Microsoft Visual Studio vyberte Odstranit a potvrďte OK.

  10. Klikněte pravým tlačítkem myši na projekt UsingWorkflowItemPresenter v Průzkumník řešení, vyberte Přidat, pak Nová položka...zobrazíte dialogové okno Přidat novou položku a v části Nainstalované šablony vlevo vyberete kategorii WPF.

  11. Vyberte šablonu okna (WPF), pojmenujte ji RehostingWFDesignera klikněte na Přidat.

  12. Otevřete soubor RehostingWFDesigner.xaml a vložte do něj následující kód, který definuje uživatelské rozhraní aplikace:

    <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. Chcete-li přidružit návrháře aktivit k typu aktivity, musíte tento návrhář aktivity zaregistrovat v úložišti metadat. Uděláte to tak, že do třídy přidáte RegisterMetadata metodu RehostingWFDesigner . V rámci oboru RegisterMetadata metody vytvořte AttributeTableBuilder objekt a zavolejte metodu AddCustomAttributes pro přidání atributů do ní. Zavolejte metodu AddAttributeTableAttributeTable pro přidání do úložiště metadat. Následující kód obsahuje logiku pro změna hostitele pro návrháře. Zaregistruje metadata, vloží do SimpleNativeActivity sady nástrojů a vytvoří pracovní postup. Vložte tento kód do souboru 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. Klikněte pravým tlačítkem myši na adresář Odkazy v Průzkumník řešení a výběrem možnosti Přidat odkaz ... zobrazte dialogové okno Přidat odkaz.

  15. Klikněte na kartu .NET , vyhledejte sestavení s názvem System.Activities.Core.Presentation, vyberte ho a klikněte na OK.

  16. Pomocí stejného postupu přidejte odkazy na následující sestavení:

    1. System.Data.DataSetExtensions.dll

    2. System.Activities.Presentation.dll

    3. System.ServiceModel.Activities.dll

  17. Otevřete soubor App.xaml a změňte hodnotu StartUpUri na RehostingWFDesigner.xaml.

  18. Klikněte pravým tlačítkem myši na projekt UsingWorkflowItemPresenter v Průzkumník řešení, vyberte Přidat, pak Nová položka... zobrazíte dialogové okno Přidat novou položku a vyberete kategorii Pracovní postup v oddílu Nainstalované šablony vlevo.

  19. Vyberte šablonu Návrháře aktivit, pojmenujte ji SimpleNativeDesignera klikněte na Tlačítko Přidat.

  20. Otevřete soubor SimpleNativeDesigner.xaml a vložte do něj následující kód. Všimněte si, že tento kód se používá ActivityDesigner jako kořenový prvek a ukazuje, jak se vazby používají k integraci WorkflowItemPresenter do návrháře, aby se v návrháři složených aktivit mohl zobrazit podřízený typ.

    Poznámka:

    Schéma pro ActivityDesigner povolení přidání pouze jednoho podřízeného elementu do vaší vlastní definice návrháře aktivit, ale tento prvek může být StackPanel, Gridnebo nějaký jiný složený prvek uživatelského rozhraní.

    <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. Klikněte pravým tlačítkem myši na projekt UsingWorkflowItemPresenter v Průzkumník řešení, vyberte Přidat, pak Nová položka... zobrazíte dialogové okno Přidat novou položku a vyberete kategorii Pracovní postup v oddílu Nainstalované šablony vlevo.

  22. Vyberte šablonu aktivity kódu, pojmenujte ji SimpleNativeActivitya klikněte na Přidat.

  23. SimpleNativeActivity Implementujte třídu zadáním následujícího kódu do souboru SimpleNativeActivity.cs:

    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 nabídce Sestavení vyberte Sestavit řešení.

  25. V nabídce Ladění vyberte Spustit bez ladění a otevřete znovu hostované okno vlastního návrhu.

Vytvoření vlastního návrháře aktivit pomocí WorkflowItemsPresenter

  1. Postup pro druhý vlastní návrhář aktivity je paralelně první s několika úpravami, první z nich je pojmenování druhé aplikace UsingWorkflowItemsPresenter. Tato aplikace také nedefinuje novou vlastní aktivitu.

  2. Hlavní rozdíly jsou obsaženy v souborech CustomParallelDesigner.xaml a RehostingWFDesigner.xaml.cs . Zde je kód ze souboru CustomParallelDesigner.xaml , který definuje uživatelské rozhraní:

    <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. Tady je kód ze souboru RehostingWFDesigner.xaml.cs , který poskytuje logiku opětovného hostování:

    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());
            }
        }
    }
    

Viz také