Partager via


Extensibilité de la grille de propriétés

Vous pouvez personnaliser la grille de propriétés affichée lorsqu’une activité donnée est sélectionnée dans le concepteur, en créant une expérience d’édition enrichie. L’exemple PropertyGridExtensibility montre comment procéder.

Montre ce qui suit

Extensibilité de la grille de propriétés du concepteur de flux de travail.

Discussions

Pour étendre la grille de propriétés, un développeur dispose d’options pour personnaliser l’apparence inline d’un éditeur de grille de propriétés ou fournir une boîte de dialogue qui s’affiche pour une surface d’édition plus avancée. Il existe deux éditeurs différents illustrés dans cet exemple ; un éditeur inline et un éditeur de boîte de dialogue.

Éditeur inline

L’exemple d’éditeur inline illustre les éléments suivants :

  • Crée un type qui dérive de PropertyValueEditor.

  • Dans le constructeur, la InlineEditorTemplate valeur est définie avec un modèle de données WPF (Windows Presentation Foundation). Cela peut être lié à un modèle XAML, mais dans cet exemple, le code est utilisé pour initialiser la liaison de données.

  • Le modèle de données a un contexte de données du PropertyValue de l'élément restitué dans la grille des propriétés. Notez dans le code suivant (à partir de CustomInlineEditor.cs) que ce contexte lie ensuite à la Value propriété.

    FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel));
    FrameworkElementFactory slider = new FrameworkElementFactory(typeof(Slider));
    Binding sliderBinding = new Binding("Value");
    sliderBinding.Mode = BindingMode.TwoWay;
    slider.SetValue(Slider.MinimumProperty, 0.0);
    slider.SetValue(Slider.MaximumProperty, 100.0);
    slider.SetValue(Slider.ValueProperty, sliderBinding);
    stack.AppendChild(slider);
    
  • Étant donné que l’activité et le concepteur se trouvent dans le même assembly, l’inscription des attributs du concepteur d’activités est effectuée dans le constructeur statique de l’activité elle-même, comme illustré dans l’exemple suivant de SimpleCodeActivity.cs.

    static SimpleCodeActivity()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor)));
        builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor)));
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }
    

Éditeur de boîte de dialogue

L’exemple d’éditeur de boîte de dialogue illustre les éléments suivants :

  1. Crée un type qui dérive de DialogPropertyValueEditor.

  2. Définit la InlineEditorTemplate valeur dans le constructeur avec un modèle de données WPF. Cela peut être créé en XAML, mais dans cet exemple, il est créé dans le code.

  3. Le modèle de données a un contexte de données du PropertyValue de l'élément restitué dans la grille des propriétés. Dans le code suivant, cela se lie ensuite à la Value propriété. Il est essentiel d’inclure également un EditModeSwitchButton bouton pour fournir le bouton qui déclenche la boîte de dialogue dans FilePickerEditor.cs.

    this.InlineEditorTemplate = new DataTemplate();
    
    FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel));
    stack.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
    FrameworkElementFactory label = new FrameworkElementFactory(typeof(Label));
    Binding labelBinding = new Binding("Value");
    label.SetValue(Label.ContentProperty, labelBinding);
    label.SetValue(Label.MaxWidthProperty, 90.0);
    
    stack.AppendChild(label);
    
    FrameworkElementFactory editModeSwitch = new FrameworkElementFactory(typeof(EditModeSwitchButton));
    
    editModeSwitch.SetValue(EditModeSwitchButton.TargetEditModeProperty, PropertyContainerEditMode.Dialog);
    
    stack.AppendChild(editModeSwitch);
    
    this.InlineEditorTemplate.VisualTree = stack;
    
  4. Substitue la méthode ShowDialog dans le type concepteur pour gérer l'affichage de la boîte de dialogue. Dans cet exemple, un élément de base FileDialog s’affiche.

    public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource)
    {
        Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
        if (ofd.ShowDialog() == true)
        {
            propertyValue.Value = ofd.FileName;
        }
    }
    
  5. Étant donné que l’activité et le concepteur se trouvent dans le même assembly, l’inscription des attributs du concepteur d’activités est effectuée dans le constructeur statique de l’activité elle-même, comme illustré dans l’exemple suivant de SimpleCodeActivity.cs.

    static SimpleCodeActivity()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor)));
        builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor)));
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }
    

Pour configurer, générer et exécuter l’exemple

  1. Générez la solution, puis ouvrez Workflow1.xaml.

  2. Faites glisser un SimpleCodeActivity de la boîte à outils vers le canevas du concepteur.

  3. Cliquez sur SimpleCodeActivity , puis ouvrez la grille de propriétés où il existe un contrôle de curseur et un contrôle de sélection de fichiers.