Compartir a través de


Diseñadores compuestos personalizados - Moderador de elementos de flujo de trabajo

System.Activities.Presentation.WorkflowItemsPresenter es un tipo clave en el modelo de programación de diseñador de WF que permite la edición de una colección de elementos incluidos. En este ejemplo se muestra cómo compilar un diseñador de actividad que muestra este tipo de colección modificable.

En el ejemplo de WorkflowItemsPresenter, se muestra lo siguiente:

  • Crear un diseñador de actividad personalizado con un objeto System.Activities.Presentation.WorkflowItemsPresenter.

  • Crear un diseñador de actividad con una vista "contraída" y "expandida".

  • Invalidar un diseñador predeterminado en una aplicación hospedada en otro host.

Configuración, compilación y ejecución del ejemplo

  1. Abra la solución de ejemplo UsingWorkflowItemsPresenter.sln para C# o para Visual Basic en Visual Studio.

  2. Compile y ejecute la solución.

    Se abre una aplicación de diseñador de flujo de trabajo hospedada en otro host; puede arrastrar actividades al lienzo.

Aspectos destacados del ejemplo

El código de este ejemplo muestra lo siguiente:

  • La actividad para la que se compila un diseñador: Parallel

  • La creación de un diseñador de actividades personalizado con un objeto System.Activities.Presentation.WorkflowItemsPresenter. Elementos que se deben señalar:

    • Observe el uso de enlace de datos de WPF para enlazarse a ModelItem.Branches. ModelItem es la propiedad de WorkflowElementDesigner que hace referencia al objeto subyacente para el que se está usando el diseñador, en este caso nuestro Parallel.

    • La propiedad WorkflowItemsPresenter.SpacerTemplate se puede utilizar para colocar un elemento visual que se mostrará entre los elementos individuales de la colección.

    • La propiedad WorkflowItemsPresenter.ItemsPanel es una plantilla que se puede proporcionar para determinar el diseño de los elementos de la colección. En este caso, se usa un panel de apilamiento horizontal.

    El ejemplo de código siguiente muestra cómo hacerlo.

    <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>
    
  • Realice una asociación de DesignerAttribute al tipo Parallel y, a continuación, genere los atributos indicados.

    • En primer lugar, registre todos los diseñadores predeterminados.

      A continuación se muestra el ejemplo de código.

      // register metadata
      (new DesignerMetadata()).Register();
      RegisterCustomMetadata();
      
      ' register metadata
      Dim metadata = New DesignerMetadata()
      metadata.Register()
      ' register custom metadata
      RegisterCustomMetadata()
      
    • A continuación, invalide el paralelo en el método RegisterCustomMetadata.

      El siguiente código muestra esta acción en C# y 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
      
  • Por último, observe el uso de diferentes plantillas de datos y desencadenadores para seleccionar la plantilla adecuada en función de la propiedad IsRootDesigner.

    A continuación se muestra el ejemplo de código.

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

Consulte también