Condividi tramite


Finestre di progettazione composite personalizzate - Relatore di elementi del flusso di lavoro

System.Activities.Presentation.WorkflowItemsPresenter è un tipo chiave nel modello di programmazione della finestra di progettazione di WF che consente la modifica di una raccolta di elementi contenuti. In questo esempio viene illustrato come compilare un ActivityDesigner che espone una raccolta modificabile.

L'esempio WorkflowItemsPresenter illustra:

  • Creazione di un ActivityDesigner personalizzato con un oggetto System.Activities.Presentation.WorkflowItemsPresenter.

  • Creazione di una finestra di progettazione attività con una vista "compressa" ed "espansa".

  • Esecuzione dell'override di una finestra di progettazione predefinita in un'applicazione riallocata.

Impostare, compilare ed eseguire l'esempio

  1. Aprire la soluzione di esempio UsingWorkflowItemsPresenter.sln per C# o per Visual Basic in Visual Studio.

  2. Compilare ed eseguire la soluzione.

    Si aprirà un'applicazione della finestra di progettazione flussi di lavoro riallocata ed è possibile trascinare attività nel canvas.

Elementi salienti dell'esempio

Nel codice di questo esempio viene illustrato quanto segue:

  • Compilazione di una finestra di progettazione dell'attività per: Parallel

  • La creazione di un ActivityDesigner personalizzato con un oggetto System.Activities.Presentation.WorkflowItemsPresenter. Alcune considerazioni:

    • Notare l'uso dell'associazione dati WPF per eseguire l'associazione a ModelItem.Branches. ModelItem è la proprietà su WorkflowElementDesigner che fa riferimento all'oggetto sottostante la finestra di progettazione per il quale è usata, in questo caso, Parallel.

    • WorkflowItemsPresenter.SpacerTemplate può essere usato per inserire un elemento visivo per visualizzare i singoli elementi nella raccolta.

    • WorkflowItemsPresenter.ItemsPanel è un modello che può essere fornito per determinare il layout degli elementi nella raccolta. In questo caso, viene usato un pannello Stack orizzontale.

    Nel codice dell'esempio seguente viene illustrata questa operazione.

    <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>
    
  • Eseguire un'associazione di DesignerAttribute al tipo Parallel, quindi restituire gli attributi indicati.

    • Registrare innanzitutto tutte le finestre di progettazione predefinite.

      Di seguito è riportato l'esempio di codice.

      // register metadata
      (new DesignerMetadata()).Register();
      RegisterCustomMetadata();
      
      ' register metadata
      Dim metadata = New DesignerMetadata()
      metadata.Register()
      ' register custom metadata
      RegisterCustomMetadata()
      
    • Eseguire quindi l'override dell'elemento parallelo nel metodo RegisterCustomMetadata.

      Nel codice seguente viene illustrato questa operazione in C# e 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
      
  • Osservare infine notare l'uso di diversi modelli di dati e trigger per selezionare il modello appropriato in base alla proprietà IsRootDesigner.

    Di seguito è riportato l'esempio di codice.

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

Vedi anche