Estendibilità della griglia delle proprietà

È possibile personalizzare la griglia delle proprietà visualizzata quando viene selezionata una determinata attività all'interno della finestra di progettazione, creando un'esperienza di modifica avanzata. L'esempio PropertyGridExtensibility mostra come fare.

Dimostra

Estensibilità della griglia delle proprietà della finestra di progettazione flussi di lavoro.

Discussione

Per estendere la griglia delle proprietà, uno sviluppatore dispone di opzioni per personalizzare l'aspetto inline di un editor della griglia delle proprietà o fornire una finestra di dialogo che viene visualizzata per un'area di modifica più avanzata. In questo esempio vengono illustrati due editor diversi, ovvero un editor inline e un editor della finestra di dialogo.

Editor inline

Nell'esempio di editor inline viene illustrato quanto segue:

  • Viene creato un tipo che deriva da PropertyValueEditor.

  • Nel costruttore, il valore InlineEditorTemplate viene impostato con un modello di dati di Windows Presentation Foundation (WPF). È possibile associarlo a un modello XAML, ma in questo esempio il codice viene usato per inizializzare l'associazione dati.

  • Il modello di dati dispone di un contesto dei dati di PropertyValue dell'elemento di cui è stato eseguito il rendering nella griglia delle proprietà. Notare nel codice seguente (da CustomInlineEditor.cs) che questo contesto viene quindi associato alla proprietà Value.

    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);
    
  • Poiché l'attività e la finestra di progettazione sono nello stesso assembly, la registrazione degli attributi di ActivityDesigner viene completata nel costruttore statico dell'attività stessa, come illustrato nell'esempio seguente da 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());
    }
    

editor finestre

Nell'esempio di editor finestre viene illustrato quanto segue:

  1. Viene creato un tipo che deriva da DialogPropertyValueEditor.

  2. Imposta il valore InlineEditorTemplate nel costruttore con un modello di dati WPF. Può essere creato in XAML, ma in questo esempio viene creato nel codice.

  3. Il modello di dati dispone di un contesto dei dati di PropertyValue dell'elemento di cui è stato eseguito il rendering nella griglia delle proprietà. Nel codice seguente viene quindi eseguita l'associazione alla proprietà Value. È importante includere inoltre un oggetto EditModeSwitchButton per fornire il pulsante che genera la finestra di dialogo in 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. Viene eseguito l'override del metodo ShowDialog nel tipo di finestra di progettazione per gestire la visualizzazione della finestra di dialogo. In questo esempio viene illustrato un oggetto FileDialog di base.

    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. Poiché l'attività e la finestra di progettazione sono nello stesso assembly, la registrazione degli attributi di ActivityDesigner viene completata nel costruttore statico dell'attività stessa, come illustrato nell'esempio seguente da 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());
    }
    

Per impostare, compilare ed eseguire l'esempio

  1. Compilare la soluzione, quindi aprire il file Workflow1.xaml.

  2. Trascinare un oggetto SimpleCodeActivity dalla casella degli strumenti al canvas della finestra di progettazione.

  3. Fare clic su SimpleCodeActivity e quindi aprire la griglia delle proprietà dove sono presenti un dispositivo di scorrimento e un controllo di selezione file.