Benutzerdefinierte zusammengesetzte Designer – Workflowelementpräsentation

System.Activities.Presentation.WorkflowItemsPresenter ist ein Haupttyp im WF-Designer-Programmiermodell, der die Bearbeitung einer Auflistung enthaltener Elemente zulässt. In dem Beispiel wird veranschaulicht, wie ein Aktivitätsdesigner erstellt wird, der eine solche bearbeitbare Auflistung aufweist.

Das WorkflowItemsPresenter-Beispiel veranschaulicht Folgendes:

  • Erstellen eines benutzerdefinierten Aktivitätsdesigners mit einem System.Activities.Presentation.WorkflowItemsPresenter.

  • Erstellen eines Aktivitätsdesigners mit einer „reduzierten“ und „erweiterten“ Ansicht.

  • Überschreiben eines standardmäßigen Designers in einer neu gehosteten Anwendung.

Einrichten, Erstellen und Ausführen des Beispiels

  1. Öffnen Sie die Beispielprojektmappe UsingWorkflowItemsPresenter.sln für C# oder für Visual Basic in Visual Studio.

  2. Erstellen Sie das Projekt, und führen Sie es aus.

    Eine neu gehostete Workflow-Designer-Anwendung wird geöffnet, und Sie können Aktivitäten auf den Zeichenbereich ziehen.

Das Wichtigste zum Beispiel

Der Code für dieses Beispiel zeigt Folgendes:

  • Die Aktivität, für die ein Designer erstellt wird: Parallel

  • Die Erstellung eines benutzerdefinierten Aktivitätsdesigners mit einem System.Activities.Presentation.WorkflowItemsPresenter. Einige wichtige Punkte:

    • Beachten Sie die Verwendung der WPF-Datenbindung, um eine Bindung an ModelItem.Branches auszuführen. ModelItem ist die Eigenschaft im WorkflowElementDesigner, die auf das zugrunde liegende Objekt verweist, für das der Designer verwendet wird; in diesem Fall Parallel.

    • WorkflowItemsPresenter.SpacerTemplate kann verwendet werden, um ein visuelle Trennung festzulegen, die zwischen den einzelnen Elementen in der Auflistung angezeigt werden soll.

    • WorkflowItemsPresenter.ItemsPanel ist eine Vorlage, die bereitgestellt werden kann, um das Layout der Elemente in der Auflistung zu bestimmen. In diesem Fall wird ein horizontaler Stapelbereich verwendet.

    Dies wird im folgenden Codebeispiel gezeigt.

    <sad:WorkflowItemsPresenter HintText="Drop Activities Here"
                                  Items="{Binding Path=ModelItem.Branches}">
        <sad:WorkflowItemsPresenter.SpacerTemplate>
          <DataTemplate>
            <Ellipse Width="10" Height="10" Fill="Black"/>
          </DataTemplate>
        </sad:WorkflowItemsPresenter.SpacerTemplate>
        <sad:WorkflowItemsPresenter.ItemsPanel>
          <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
          </ItemsPanelTemplate>
        </sad:WorkflowItemsPresenter.ItemsPanel>
      </sad:WorkflowItemsPresenter>
    
  • Führen Sie eine Zuordnung von DesignerAttribute zum Parallel-Typ aus, und geben Sie dann die gemeldeten Attribute aus.

    • Registrieren Sie zuerst alle standardmäßigen Designer.

      Nachfolgend ist das Codebeispiel angegeben.

      // register metadata
      (new DesignerMetadata()).Register();
      RegisterCustomMetadata();
      
      ' register metadata
      Dim metadata = New DesignerMetadata()
      metadata.Register()
      ' register custom metadata
      RegisterCustomMetadata()
      
    • Überschreiben Sie dann "Parallel" in der RegisterCustomMetadata-Methode.

      Im folgenden Code wird dies in C# und Visual Basic veranschaulicht.

      void RegisterCustomMetadata()
      {
            AttributeTableBuilder builder = new AttributeTableBuilder();
            builder.AddCustomAttributes(typeof(Parallel), new DesignerAttribute(typeof(CustomParallelDesigner)));
            MetadataStore.AddAttributeTable(builder.CreateTable());
      }
      
      Sub RegisterCustomMetadata()
         Dim builder As New AttributeTableBuilder()
         builder.AddCustomAttributes(GetType(Parallel), New DesignerAttribute(GetType(CustomParallelDesigner)))
         MetadataStore.AddAttributeTable(builder.CreateTable())
      End Sub
      
  • Beachten Sie schließlich die Verwendung unterschiedlicher Datenvorlagen und Trigger, um die entsprechende Vorlage auf Grundlage der IsRootDesigner-Eigenschaft auszuwählen.

    Nachfolgend ist das Codebeispiel angegeben.

    <sad:ActivityDesigner x:Class="Microsoft.Samples.CustomParallelDesigner"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sad="clr-namespace:System.Activities.Design;assembly=System.Activities.Design"
        xmlns:sadv="clr-namespace:System.Activities.Design.View;assembly=System.Activities.Design">
      <sad:ActivityDesigner.Resources>
        <DataTemplate x:Key="Expanded">
          <StackPanel>
            <TextBlock>This is the Expanded View</TextBlock>
            <sad:WorkflowItemsPresenter HintText="Drop Activities Here"
                                        Items="{Binding Path=ModelItem.Branches}">
              <sad:WorkflowItemsPresenter.SpacerTemplate>
                <DataTemplate>
                  <Ellipse Width="10" Height="10" Fill="Black"/>
                </DataTemplate>
              </sad:WorkflowItemsPresenter.SpacerTemplate>
              <sad:WorkflowItemsPresenter.ItemsPanel>
                <ItemsPanelTemplate>
                  <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
              </sad:WorkflowItemsPresenter.ItemsPanel>
            </sad:WorkflowItemsPresenter>
          </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="Collapsed">
          <TextBlock>This is the Collapsed View</TextBlock>
        </DataTemplate>
        <Style x:Key="ExpandOrCollapsedStyle" TargetType="{x:Type ContentPresenter}">
          <Setter Property="ContentTemplate" Value="{DynamicResource Collapsed}"/>
          <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsRootDesigner}" Value="true">
              <Setter Property="ContentTemplate" Value="{DynamicResource Expanded}"/>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </sad: ActivityDesigner.Resources>
      <Grid>
        <ContentPresenter Style="{DynamicResource ExpandOrCollapsedStyle}" Content="{Binding}"/>
      </Grid>
    </sad: ActivityDesigner>
    

Siehe auch