Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Ontwerpers van aangepaste activiteiten worden doorgaans geïmplementeerd, zodat hun bijbehorende activiteiten samenstelbaar zijn met andere activiteiten waarvan ontwerpers met hen op het ontwerpoppervlak kunnen worden geplaatst. Deze functionaliteit vereist dat een ontwerpfunctie voor aangepaste activiteiten een 'drop zone' biedt waar een willekeurige activiteit kan worden geplaatst en ook de middelen om de resulterende verzameling elementen op het ontwerpoppervlak te beheren. In dit onderwerp wordt beschreven hoe u een ontwerpfunctie voor aangepaste activiteiten maakt die een dergelijke neervalzone bevat en hoe u een aangepaste activiteitontwerper maakt die de bewerkingsfunctionaliteit biedt die nodig is om de verzameling ontwerpelementen te beheren.
Aangepaste activiteitontwerpers nemen ActivityDesigner doorgaans het standaardtype basisactiviteitontwerper over voor activiteiten zonder een specifieke ontwerper. Dit type biedt de ontwerptijd van interactie met het eigenschappenraster en het configureren van basisaspecten zoals het beheren van kleuren en pictogrammen.
ActivityDesigner maakt gebruik van twee helperbesturingselementen WorkflowItemPresenter en WorkflowItemsPresenter maakt het eenvoudiger om aangepaste activiteitontwerpers te ontwikkelen. Ze verwerken algemene functionaliteit, zoals slepen en neerzetten van onderliggende elementen, verwijdering, selectie en toevoeging van deze onderliggende elementen. Hiermee WorkflowItemPresenter staat u één onderliggend UI-element toe, waarbij de 'neerzetzone' wordt geboden, terwijl het WorkflowItemsPresenter ondersteuning biedt voor meerdere UI-elementen, waaronder aanvullende functionaliteit zoals de volgorde, het verplaatsen, verwijderen en toevoegen van onderliggende elementen.
Het andere belangrijke onderdeel van het verhaal dat moet worden gemarkeerd in de implementatie van een aangepaste activiteitontwerper, heeft betrekking op de manier waarop de visuele bewerkingen afhankelijk zijn van WPF-gegevensbinding naar het exemplaar dat is opgeslagen in het geheugen van wat we in de ontwerpfunctie bewerken. Dit wordt bereikt door de modelitemstructuur, die ook verantwoordelijk is voor het inschakelen van wijzigingsmeldingen en het bijhouden van gebeurtenissen zoals wijzigingen in statussen.
In dit onderwerp worden twee procedures beschreven.
In de eerste procedure wordt beschreven hoe u een aangepaste activiteitontwerper maakt met een WorkflowItemPresenter ontwerpfunctie voor neerzetten die andere activiteiten ontvangt. Deze procedure is gebaseerd op het voorbeeld van aangepaste samengestelde ontwerpers - presentator voor werkstroomitems.
In de tweede procedure wordt beschreven hoe u een ontwerpfunctie voor aangepaste activiteiten maakt met een WorkflowItemsPresenter ontwerpfunctie die de functionaliteit biedt die nodig is om een verzameling ingesloten elementen te bewerken. Deze procedure is gebaseerd op het voorbeeld Van aangepaste samengestelde ontwerpers - werkstroomitems presentator .
Een aangepaste activiteitontwerper maken met een drop zone met behulp van WorkflowItemPresenter
Start Visual Studio 2010.
Wijs in het menu Bestand de optie Nieuw aan en selecteer Vervolgens Project....
Het dialoogvenster Nieuw project wordt geopend.
Selecteer Windows in het deelvenster Geïnstalleerde sjablonen in de taalcategorie van uw voorkeur.
Selecteer WPF-toepassing in het deelvenster Sjablonen.
Typ in
UsingWorkflowItemPresenterhet vak Naam .Voer in het vak Locatie de map in waarin u het project wilt opslaan of klik op Bladeren om ernaar te navigeren.
Accepteer de standaardwaarde in het vak Oplossing .
Klik op OK.
Klik met de rechtermuisknop op het bestand MainWindows.xaml in Solution Explorer, selecteer Verwijderen en bevestig OK in het dialoogvenster Microsoft Visual Studio .
Klik met de rechtermuisknop op het project UsingWorkflowItemPresenter in Solution Explorer, selecteer Toevoegen en vervolgens Nieuw item... om het dialoogvenster Nieuw item toevoegen weer te geven en selecteer de WPF-categorie in de sectie Geïnstalleerde sjablonen aan de linkerkant.
Selecteer de sjabloon Window (WPF), geef deze
RehostingWFDesignereen naam en klik op Toevoegen.Open het bestand RehostingWFDesigner.xaml en plak de volgende code erin om de gebruikersinterface voor de toepassing te definiëren:
<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>Als u een activiteitontwerper wilt koppelen aan een activiteitstype, moet u die activiteitontwerper registreren bij het metagegevensarchief. Voeg hiervoor de
RegisterMetadatamethode toe aan deRehostingWFDesignerklasse. Maak binnen het bereik van deRegisterMetadatamethode een AttributeTableBuilder object en roep de AddCustomAttributes methode aan om de kenmerken eraan toe te voegen. Roep de AddAttributeTable methode aan om het AttributeTable metagegevensarchief toe te voegen. De volgende code bevat de logica voor opnieuw hosten voor de ontwerpfunctie. Het registreert de metagegevens, plaatst deSimpleNativeActivitywerkset en maakt de werkstroom. Plaats deze code in het RehostingWFDesigner.xaml.cs-bestand .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()); } } }Klik met de rechtermuisknop op de map Verwijzingen in Solution Explorer en selecteer Verwijzing toevoegen ... om het dialoogvenster Verwijzing toevoegen weer te geven.
Klik op het tabblad .NET , zoek de assembly met de naam System.Activities.Core.Presentation, selecteer deze en klik op OK.
Voeg met dezelfde procedure verwijzingen toe aan de volgende assembly's:
System.Data.DataSetExtensions.dll
System.Activities.Presentation.dll
System.ServiceModel.Activities.dll
Open het bestand App.xaml en wijzig de waarde van de StartUpUri in 'RehostingWFDesigner.xaml'.
Klik met de rechtermuisknop op het project UsingWorkflowItemPresenter in Solution Explorer, selecteer Toevoegen en vervolgens Nieuw item... om het dialoogvenster Nieuw item toevoegen weer te geven en selecteer de werkstroomcategorie in de sectie Geïnstalleerde sjablonen aan de linkerkant.
Selecteer de sjabloon Activity Designer, geef deze
SimpleNativeDesignereen naam en klik op Toevoegen.Open het bestand SimpleNativeDesigner.xaml en plak de volgende code erin. Houd er rekening mee dat deze code wordt gebruikt ActivityDesigner als het hoofdelement en laat zien hoe binding wordt gebruikt om te integreren WorkflowItemPresenter in uw ontwerpfunctie, zodat een onderliggend type kan worden weergegeven in de ontwerpfunctie voor samengestelde activiteiten.
Notitie
Met het schema kan ActivityDesigner slechts één onderliggend element worden toegevoegd aan de definitie van de ontwerpfunctie voor aangepaste activiteiten. Dit element kan echter een
StackPanel,Gridof een ander samengesteld UI-element zijn.<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>Klik met de rechtermuisknop op het project UsingWorkflowItemPresenter in Solution Explorer, selecteer Toevoegen en vervolgens Nieuw item... om het dialoogvenster Nieuw item toevoegen weer te geven en selecteer de werkstroomcategorie in de sectie Geïnstalleerde sjablonen aan de linkerkant.
Selecteer de sjabloon Codeactiviteit , geef deze
SimpleNativeActivityeen naam en klik op Toevoegen.Implementeer de
SimpleNativeActivityklasse door de volgende code in te voeren in het SimpleNativeActivity.cs-bestand :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); } } }Selecteer Build Solution in het menu Build .
Selecteer Starten zonder foutopsporing in het menu Foutopsporing om het opnieuw gehoste aangepaste ontwerpvenster te openen.
Een aangepaste activiteitontwerper maken met behulp van WorkflowItemsPresenter
De procedure voor de tweede ontwerpfunctie voor aangepaste activiteiten is de parallelle uitvoering van de eerste met een paar wijzigingen, waarvan de eerste is om de tweede toepassing
UsingWorkflowItemsPresentereen naam te geven. Deze toepassing definieert ook geen nieuwe aangepaste activiteit.Belangrijke verschillen zijn opgenomen in de bestanden CustomParallelDesigner.xaml en RehostingWFDesigner.xaml.cs . Dit is de code uit het bestand CustomParallelDesigner.xaml waarmee de gebruikersinterface wordt gedefinieerd:
<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>Dit is de code uit het RehostingWFDesigner.xaml.cs-bestand dat de logica voor opnieuw hosten biedt:
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()); } } }