Freigeben über


Benutzerdefinierte zusammengesetzte Designer – Workflowelementpräsentation

Dies System.Activities.Presentation.WorkflowItemsPresenter ist ein Schlüsseltyp im WF-Designerprogrammiermodell, das die Bearbeitung einer Sammlung von enthaltenen Elementen ermöglicht. In diesem Beispiel wird gezeigt, wie Sie einen Aktivitäts-Designer erstellen, der eine solche bearbeitbare Sammlung anzeigt.

Das Beispiel "WorkflowItemsPresenter " 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 UsingWorkflowItemsPresenter.sln Beispiellösung 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-Designeranwendung wird geöffnet, und Sie können Aktivitäten auf den Zeichenbereich ziehen.

Beispielhöhepunkte

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 Punkte, die Sie darauf hinweisen sollten:

    • Beachten Sie die Verwendung der WPF-Datenbindung, um eine Bindung an ModelItem.Branches auszuführen. ModelItem ist die Eigenschaft von WorkflowElementDesigner, die auf das zugrunde liegende Objekt verweist, für das der Designer verwendet wird. In diesem Fall handelt es sich um unsere 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 horizontales Stapelpanel verwendet.

    Dieser folgende Beispielcode zeigt dies.

    <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 Verknüpfung von DesignerAttribute mit dem Typ Parallel durch und geben Sie dann die gemeldeten Attribute aus.

    • Registrieren Sie zunächst alle Standarddesigner.

      Im Folgenden sehen Sie das Codebeispiel.

      // 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.

      Der folgende Code zeigt dies in C# und Visual Basic.

      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 basierend auf der IsRootDesigner Eigenschaft auszuwählen.

    Im Folgenden sehen Sie das Codebeispiel.

    <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