Le code suivant est destiné à répondre à une problématique courante en Workflow : Vous avez une activité dont le designer est complexe ou dont l’affichage prend une place importante à l’écran et la possibilité Collapse/Expand ne répond pas pleinement à vos attente. Vous voudriez que l’utilisateur n’ait que votre ActivityDesigner à l’écran quand il détermine les paramètres de votre activité.

La solution est plutôt simple car WF4 permet déjà les choses suivantes :

  • Si on fait un double click sur une activité, seule l’activité est visible (vue expanded). On a alors un chemin de fer en haut du designer pour remonter dans l’arborescence du Workflow.
  • L’ActivityDesigner à une propriété ShowExpanded accessible en lecture. True si on est dans une vue détaillée et False dans le cas de la vue par défaut. Cette propriété prend aussi en compte le fait que l’utilisateur ait demandé un Collapse sur l’activité.

Avec WPF on a là de bonnes base pour bâtir un Style alternant les templates en fonction de l’état de l’ActivityDesigner.

Le Xaml de l’ActivityDesigner :

<sap:ActivityDesigner x:Class="cs.TestActivityDesigner"
    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>
        <ResourceDictionary>
            <!-- Style du ContentPresenter de l'activité-->
            <Style x:Key="ContentPresenterStyle" TargetType="{x:Type ContentPresenter}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=ShowExpanded}" Value="true">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <!-- Vue détaillée, seule l'activité est visible dans ce mode -->
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="auto"/>
                                            <RowDefinition Height="auto"/>
                                            <RowDefinition Height="auto"/>
                                            <RowDefinition Height="auto"/>
                                        </Grid.RowDefinitions>
                                        
                                        <TextBlock Grid.Row="0" Grid.Column="0" Text="Activité 1"/>
                                        <sap:WorkflowItemPresenter Grid.Row="0" Grid.Column="1"
                                            Item="{Binding Path=ModelItem.Activity1}"
                                            HintText="Glissez votre activité ici" />
                                        
                                        <TextBlock Grid.Row="1" Grid.Column="0" Text="Activité 1"/>
                                        <sap:WorkflowItemPresenter Grid.Row="1" Grid.Column="1"
                                            Item="{Binding Path=ModelItem.Activity2}"
                                            HintText="Glissez votre activité ici" />
                                        
                                        <TextBlock Grid.Row="2" Grid.Column="0" Text="Activités x"/>
                                        <sap:WorkflowItemsPresenter Grid.Row="2" Grid.Column="1"
                                            Items="{Binding Path=ModelItem.Activities}"
                                            HintText="Glissez vos activités ici" />
                                    </Grid>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
                <Style.Setters>
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <!-- Vue réduite -->
                                <TextBlock Text="Double-clicker ici pour pour éditer cette activité"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style.Setters>
            </Style>
        </ResourceDictionary>
    </sap:ActivityDesigner.Resources>
    <ContentPresenter Content="{Binding}"/>
</sap:ActivityDesigner>

Il ne nous manque plus que la possibilité de passer notre ActivityDeigner dans une vue réduite. Cela se fait en passant la propriété ExpandState à  False comme ceci :

Le code C# :

public partial class TestActivityDesigner
{
    public TestActivityDesigner()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(TestActivityDesigner_Loaded);
    }

    void TestActivityDesigner_Loaded(object sender, RoutedEventArgs e)
    {
        base.ExpandState = false;
    }        
}

Ce qui concrètement permettra d’avoir un designer utilisant les deux vues suivante:

wf4_designexpanded0 wf4_designexpanded1